李斌ID:libin_ftsafe
3234次访问,排名2万外好友21人,关注者0
从事IT及相关行业工作超过7年,从事过互联网/银行系统/电信系统/智能卡等多个行业应用领域的设计和开发工作。

一度热衷于SQL Server 2000数据库的设计与开发,曾在DEV-CLUB/CSDN等多个技术论坛灌水。

对智能卡领域JAVA CARD分支有一定的经验可与大家分享。

目前在一家智能卡公司担任Payment/Identify领域智能卡技术顾问。
libin_ftsafe的文章
原创 6 篇
翻译 0 篇
转载 0 篇
评论 6 篇
子陌红尘的公告
没有公告
最近评论
mldstk:wow power leveling
mldstk:wow power leveling
bluesky610031:好,学习!
dobear_0922:呵呵,最后一招果然够猛!

不过,在SQL2005中,select top 100 percent *与select *是一样的:把100改成99才行 ^o^

StmtText
------------------------------……
jinjazz:没整个法国妞儿回来??
文章分类
收藏
    相册
    CSDN聚会照片
    印象巴黎[二]——卢森堡公园
    印象巴黎[一]——艾菲尔
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 比较复杂的动态SQL语句功能一例收藏

    新一篇: 印象巴黎[一]——艾菲尔 | 旧一篇: 谁说游标一定慢?

    今天在论坛里见到一个关于动态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

    发表于 @ 2007年01月26日 16:13:00|评论(loading...)|收藏

    新一篇: 印象巴黎[一]——艾菲尔 | 旧一篇: 谁说游标一定慢?

    评论

    #xiaofanku 发表于2008-02-21 12:51:18  IP: 218.108.43.*
    很强!向大哥学习!
    #bluesky610031 发表于2008-06-15 00:16:15  IP: 222.95.176.*
    好,学习!
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 子陌红尘