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

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

原来表内容:

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

想得到的结果:

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

None.gif--测试:
None.gif
create table tb(姓名 varchar(5), 年龄 int , 班级 varchar(10))
None.gif
insert into tb
None.gif
select '张三',11,'高一(2)'union all
None.gif
select '李四',12,'高一(1)' union all
None.gif
select '王五',12,'高一(2)' union all
None.gif
select '赵六',12,'高一(2)' 
None.gif
None.gif
--原始数据
None.gif
select * from tb
None.gif
None.gif
--如果班级并不多,可以静态指出列的个数
None.gif
select '高一(1)'=sum(case when 班级='高一(1)' then 1 else 0 end),
None.gif       
'高一(2)'=sum(case when 班级='高一(2)' then 1 else 0 end)
None.gif
from tb
None.gif
None.gif
--如果班级比较多,而且不知道班级名称,使用下面动态语句
None.gif
declare @sql varchar(8000)
None.gif
set @sql=''
None.gif
select @sql=case when @sql='' then @sql+'sum(case 班级 when '''+班级+''' then 1 else 0 end) as ['+班级+']' 
None.gif
else @sql+',sum(case 班级 when '''+班级+''' then 1 else 0 end) as ['+班级+']' end
None.gif
from tb
None.gif
group by 班级 order by 班级 asc
None.gif
exec('select '+@sql+' from tb')
None.gif
None.gif
--删除测试表
None.gif
drop table tb


文章来源于 http://www.cnblogs.com/zhangzs8896 版权归原作者所有
阅读更多
文章标签: sql 测试
个人分类: .NET
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭