比较复杂的动态SQL语句功能一例

原创 2007年01月26日 16:13:00

今天在论坛里见到一个关于动态SQL问题,觉得有点意思,于是解答了一下,顺便把我的解决方案转到这里。

----------------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------------------

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

比较复杂的动态SQL语句功能一例

今天在论坛里见到一个关于动态SQL问题,觉得有点意思,于是解答了一下,顺便把我的解决方案转到这里。---------------------------------------------------...
  • Terry001
  • Terry001
  • 2007年02月22日 04:24
  • 735

比较复杂的动态SQL语句功能一例[不太懂,好好研究一下]

今天在论坛里见到一个关于动态SQL问题,觉得有点意思,于是解答了一下,顺便把我的解决方案转到这里。---------------------------------------------------...
  • Johnson_hejun
  • Johnson_hejun
  • 2008年10月17日 10:14
  • 383

比较复杂sql语句集

减集查未绑定关系的数据sql select * from t_e_question where questioncode in( select questioncode from t_e_ques...
  • wenzhihui_2010
  • wenzhihui_2010
  • 2014年07月24日 14:02
  • 1355

动态SQL语句的语法

动态SQL是在运行时生成和执行SQL语句的编程方法。动态是和静态相对而言的。静态SQL指的是在代码编译时刻就已经包含在代码中的那些已经充分明确的固定的SQL语句。 PL/ SQL提供了两种方式来编写动...
  • chiclewu
  • chiclewu
  • 2013年11月14日 22:16
  • 5277

如何使用动态SQL语句?

这里只介绍动态SQL的使用。关于动态SQL语句的语法,参见:http://blog.csdn.net/chiclewu/article/details/16097133 1.什么是时候需要使用动态S...
  • chiclewu
  • chiclewu
  • 2013年12月03日 22:21
  • 3679

Mybatis使用之动态SQL语句

摘要: Mybatis动态SQL语句可帮助我们根据需要动态拼接SQL语句。主要在配置文件中使用 标签来实现。...
  • chenghuaying
  • chenghuaying
  • 2015年05月20日 22:21
  • 2081

比较复杂的动态SQL语句功能一例!根据列,与行名定制!

Question:本人想做一个组合统计,谁可以告诉我怎么实现。表如下形式:id    sex    school    government   area  ---------------------...
  • fuda_1985
  • fuda_1985
  • 2008年04月16日 16:40
  • 265

mybatis动态SQL语句整理

本博文转载自:点击打开链接http://blog.csdn.net/ask_rent/article/details/6320326 三、动态SQL语句   有些时候,sql语...
  • see__you__again
  • see__you__again
  • 2016年07月07日 11:04
  • 2137

动态执行sql语句

execute immediate 语法后面跟上sql语句可以动态执行sql语句.使用场景:(1)加入动态表.比如你有一张表的名字不明确,是需要判断得到的,则可以使用该语法来生成sql语句.(2)加入...
  • caozhifindjob
  • caozhifindjob
  • 2009年12月26日 19:09
  • 1673

配置Mybatis的动态sql语句

今天项目经理让我们做一个Mybatis的动态sql语句配置文件 要求如下: (1).提交个多个(3个以上)条件的查询的mapper配置文件。 当参数不传则不作为查询的条件 (2).insert ,u...
  • yesz12358
  • yesz12358
  • 2016年08月03日 13:32
  • 1012
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:比较复杂的动态SQL语句功能一例
举报原因:
原因补充:

(最多只允许输入30个字)