关于统计的一个sql问题,使用动态sql语句实现。

<script language='javascript' src='http://www.shiqiaotou.com/donetk/Header.js'></script>

问题出自:http://community.csdn.net/Expert/topic/3495/3495537.xml?temp=.9028894

原来表内容:

姓名    年龄          班级        
----- ----------- ----------
张三    11          高一(2)
李四    12          高一(1)
王五    12          高一(2)
赵六    12          高一(2)

想得到的结果:

高一(1)       高一(2)      
----------- -----------
1           3

-- 测试:
create   table  tb(姓名  varchar ( 5 ), 年龄  int  , 班级  varchar ( 10 ))
insert   into  tb
select   ' 张三 ' , 11 , ' 高一(2) ' union   all
select   ' 李四 ' , 12 , ' 高一(1) '   union   all
select   ' 王五 ' , 12 , ' 高一(2) '   union   all
select   ' 赵六 ' , 12 , ' 高一(2) '  

-- 原始数据
select   *   from  tb

-- 如果班级并不多,可以静态指出列的个数
select   ' 高一(1) ' = sum ( case   when  班级 = ' 高一(1) '   then   1   else   0   end ),
       
' 高一(2) ' = sum ( case   when  班级 = ' 高一(2) '   then   1   else   0   end )
from  tb

-- 如果班级比较多,而且不知道班级名称,使用下面动态语句
declare  @sql  varchar ( 8000 )
set  @sql = ''
select  @sql = case   when  @sql = ''   then  @sql + ' sum(case 班级 when  ''' + 班级 + '''  then 1 else 0 end) as [ ' + 班级 + ' ] '  
else  @sql + ' ,sum(case 班级 when  ''' + 班级 + '''  then 1 else 0 end) as [ ' + 班级 + ' ] '   end
from  tb
group   by  班级  order   by  班级  asc
exec ( ' select  ' + @sql + '  from tb ' )

-- 删除测试表
drop   table  tb


文章来源于 http://www.cnblogs.com/zhangzs8896 版权归原作者所有<script language='javascript' src='http://www.shiqiaotou.com/donetk/Footer.js'></script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值