比较复杂的动态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语句,但相对比较复杂一些的

1.根据同一数据库内同一列的不同值进行查询,相同值的其他数据(mapper文件  type是列的属性值)       select type,SUM(num) as num from ds_stati...

一条比较复杂的update sql语句

前两天花了俩天时间录入的数据,结果发现少了一列,电压等级!!! 再重新录一遍简直是要了人的老命了!思考一条update语句完成更新操作 已有的表: 一张电压表(电压id,具体电压) 母...

SQL一些比较复杂的操作语句,不断更新中。。。。。。。

实习已然两个半月了,并没有进入正轨,而明星程序员萧井陌建议我辞职,确实在理。 所以在考虑中。这段时间,用到的sql语句,也是重新让我觉得SQL也是一门大学问,并不是只有简单的查找删。下面,是一些觉得有...
  • lindiwo
  • lindiwo
  • 2015年09月11日 15:05
  • 353

动态SQL语句基本语法

  • 2010年01月31日 02:40
  • 173KB
  • 下载

动态SQL语句

  • 2012年03月12日 10:32
  • 195KB
  • 下载

MyBatis动态Sql语句

MyBatis中对数据库的操作,有时要带一些条件,因此动态SQL语句非常有必要,下面就主要来讲讲几个常用的动态SQL语句的语法 and STU_...

iBatis.net使用动态sql语句

  • 2015年12月04日 10:42
  • 89KB
  • 下载

学习SQL应知道的动态SQL语句(doc)

  • 2008年10月28日 19:00
  • 64KB
  • 下载

MyBatis动态sql详解(二) foreach语句详解

一、介绍:   foreach主要是用于一个循环,大部分用到的是循环的生成sql,下面说一下动态foreach的属性:   foreach元素的属性主要有item,index,collection...

动态SQL语句基本语法

  • 2010年09月13日 09:06
  • 321KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:比较复杂的动态SQL语句功能一例
举报原因:
原因补充:

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