程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 較復雜的動態SQL語句功能一例

較復雜的動態SQL語句功能一例

編輯:.NET實例教程

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

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved