Question:
本人想做一個組合統計,誰可以告訴我怎麼實現。
表如下形式:
id sex school government area
-----------------------------------------
*** 男 中學 團員 北京
*** 男 大學 黨員 上海
*** 女 小學 群眾 北京
*** 女 中學 群眾 天津
*** 男 小學 黨員 上海
*** 女 大學 團員 北京
-------------------------------------------
現在想統計出一個列表,列表橫軸和縱軸 分別可由以上4個字段中的一個或幾個組合而成。實現橫縱都可以動態定制。
比如:
/*
school 群眾 團員 黨員
------ ---- ----- -----------
大學 1 1 1
小學 1 1 1
中學 1 1 1
*/
或著
/*
school 群眾 團員 黨員
------ ---- ----- -----------
北京 1 1 1
上海 1 1 1
天津 1 1 1
*/
又或者
/*
school 群眾 團員 黨員 北京 上海 天津
------ ---- ----- ----------- ---- ----- -----
大學 1 1 1 1 1 1
小學 1 1 1 1 1 1
中學 1 1 1
*/
又或者
/*
school 群眾 團員 黨員 北京 上海 天津
------ ---- ----- ----------- ---- ----- -----
大學 1 1 1 1 1 1
小學 1 1 1 1 1 1
中學 1 1 1 1 1 1
男
女
*/
----------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------
Answer:
--生成測試數據
create table t(id varchar(6),sex varchar(6),school varchar(6),government varchar(6),area varchar(6))
insert into t select ''***'',''男'',''中學'',''團員'',''北京''
insert into t select ''***'',''男'',''大學'',''黨員'',''上海''
insert into t select ''***'',''女'',''小學'',''群眾'',''北京''
insert into t select ''***'',''女'',''中學'',''群眾'',''天津''
insert into t select ''***'',''男'',''小學'',''黨員'',''上海''
insert into t select ''***'',''女'',''大學'',''團員'',''北京''
go
--創建存儲過程
--@str_col:用於橫向排列的列,以'',''作為結束符
--@str_row:用戶縱向分組的列,以'',''作為結束符
create procedure sp_test(@str_col varchar(80),@str_row varchar(80))
as
begin
declare @sql varchar(8000),
@str1 varchar(8000),
@str2 varchar(8000),
@temp nvarchar(4000),
@col varchar(20),
@row varchar(20)
set @sql =''''
set @str1=''''
while charindex('','',@str_col)>0
begin
set @col=left(@str_col,charindex('','',@str_col)-1)
set @str_col=stuff(@str_col,1,charindex('','',@str_col),'''')
set @temp=N''set @s=''''''''
select @s=@s+'''',[''''+''+@col+''+'''']=sum(case ''+@col+'' when ''''''''''''+''+@col+''+'''''''''''' then 1 else 0 end) ''''
from t group by ''+@col
exec sp_executesql @temp,N''@s varchar(8000) out'',@str2 out
set @str1=@str1+@str2
end
while charindex('','',@str_row)>0
begin
set @row=left(@str_row,charindex('','',@str_row)-1)
set @str_row=stuff(@str_row,1,charindex('','',@str_row) '''')
set @sql=@sql+'' union all select ''+@row+'' as 項目''+@str1+'' from t group by ''+@row
end
set @sql=stuff(@sql,1,11,'''')
exec(@sql)
end
go
--執行測試
exec sp_test ''school,sex,'',''government,area,''
go
--輸出測試結果
/*
項目 大學 小學 中學 男 女
------ ----------- ----------- ----------- ----------- -----------
黨員 1 1 0 2 0
群眾 0 1 1 0 2
團員 1 0 1 1 1
北京 1 1 1 1 2
上海 1 1 0 2 0
天津 0 0 1 0 1
*/
--刪除測試環境
drop table t
drop procedure sp_test
go