日期:2014-05-17  浏览次数:20499 次

急,高手进,关于月份横向统计的sql
新手,想起来有点乱,看明白的帮我理下,最好帮我写出来,因为周六要给人家汇报。


姓名  成绩  月份
小李  500   201206
小张  400   201206
小王  300   201206
小李  500   201206
小张  400   201204
小王  300   201204
小张  400   201205
小王  300   201205
....
想实现的结果

姓名   201204的成绩   201205的成绩 201206的成绩 ....后面可能还有很多月份的成绩
小李              0                    0                 1000      ...
小王           300                300                300      ...
小张           400                400                 400      ...
   
现在我如果查询的是从201204到201205 的时间内结果,那就只有201204的成绩和201205成绩。如果我要查询的是从201204到201209,那就有201204的成绩........201209的成绩。

实现写动态查询的sql语句.
不知道我说行够不够清楚.晕啊.
------最佳解决方案--------------------
试试,表头你自己拼接
DECLARE @s NVARCHAR(4000)
 SET @s = ''
 SELECT  @s = @s + ',' + QUOTENAME([月份]) + '=max(case when [月份]='
         + QUOTENAME([月份], '''') + ' then isnull([成绩],0) else 0 end)'
 FROM    tb
 GROUP BY [姓名]
 EXEC('select [姓名]'+@s+' from tb group by [姓名]')

------其他解决方案--------------------
 参加方法 
http://bbs.csdn.net/topics/240002706
------其他解决方案--------------------
明天回公司试试.谢谢,这么快就有回复.
------其他解决方案--------------------
引用:
参加方法 
http://bbs.csdn.net/topics/240002706
大版,我就是拿你这个来改滴
------其他解决方案--------------------
我还有一个问题,我传了参数201204和201209.然后算出他之间的月份即:201204 201205 201206 201207 201208 201209. 这几个动态的添加。
------其他解决方案--------------------
引用:
引用:
参加方法  http://bbs.csdn.net/topics/240002706大版,我就是拿你这个来改滴


你做的是怎样的,能分享下吗
------其他解决方案--------------------
二楼正解。。。。
------其他解决方案--------------------
加两个参数:
DECLARE @s NVARCHAR(4000)
  SET @s = ''
  SELECT  @s = @s + ',' + QUOTENAME([月份]) + '=max(case when [月份]='
          + QUOTENAME([月份], '''') + ' then isnull([成绩],0) else 0 end)'