【SQL SERVER 2005+版本行转列示例】(2012年1-8月水源槑党25强榜单新鲜出炉)

来源:互联网 发布:单片机怎么连接电脑 编辑:程序博客网 时间:2024/05/17 06:13

在CSDN社区 MS-SQLSERVER板块,关于行转列的问题,层出不穷,之前dawugui,roy_88等高手都多次整理过,我就不再整理了,只是给出一个示例,以供大家参考。


槑党是CSDN水源2012年新出现的,这里对2012年1-8月的相关数据,简单的统计一下。


数据采集于下面地址:

http://forum.csdn.net/PointForum/Forum/ExpertTopList.aspx?flg=bigMonth&forumid=d5ce81ef-7dab-4abb-a7ca-ac03342ae03b&bigclassid=d5ce81ef-7dab-4abb-a7ca-ac03342ae03b&smallclassid=9231e8e0-b9bc-4c51-b364-ba68665814cc&date=2012-6&year=2012&month=6

统计只是在扩充话题板块TOP100名单中出现的用户,以昵称中出现槑党字样的为样本。

数据显示槑党在2012年1-8月期间,TOP100中有的相关数据共得216951分。

行转列后的统计结果为:



数据脚本我已经上传到了下载频道,有感兴趣的朋友,可以去免费下载。

地址: 相关数据脚本下载地址(含创建表的脚本和插入数据的脚本,无需积分)  


行转列代码如下:

[sql] view plaincopyprint?
  1. --SQL SERVER 2005+ 静态行转列示例  
  2. select   
  3.     row_number() over (order by   
  4.         (select sum(score) from dduser   
  5.                            where username=b.username) desc)   as 总排名,  
  6.     (select sum(score) from dduser where username=b.username) as 总得分,  
  7.     userDisplay as 昵称,  
  8.     username as 账号,  
  9.     max(isnull('第'+ltrim([1])+'名','')) as [1月],  
  10.     max(isnull('第'+ltrim([2])+'名','')) as [2月],  
  11.     max(isnull('第'+ltrim([3])+'名','')) as [3月],  
  12.     max(isnull('第'+ltrim([4])+'名','')) as [4月],  
  13.     max(isnull('第'+ltrim([5])+'名','')) as [5月],  
  14.     max(isnull('第'+ltrim([6])+'名','')) as [6月],  
  15.     max(isnull('第'+ltrim([7])+'名','')) as [7月],  
  16.     max(isnull('第'+ltrim([8])+'名','')) as [8月]  
  17. from   
  18. (select * from dduser) a   
  19. pivot (max(rank) for [monthin ([1],[2],[3],[4],[5],[6],[7],[8])) b  
  20. group by username,userDisplay order by 总得分 desc  
  21.   
  22.   
  23. --SQL SERVER 2005+ 动态行转列示例  
  24. declare @sql varchar(max),@colname varchar(max)  
  25. select @sql = isnull(@sql + '],[' , '') + ltrim([month]) from dduser group by [month]  
  26. set @sql = '[' + @sql + ']'  
  27. select @colname=  
  28.         isnull(@colname+',','')+'max(isnull(''第''+ltrim(['  
  29.         +ltrim([month])+'])+''名'','''')) as ['+ltrim([month])+'月]'  
  30. from dduser group by [month]  
  31. exec (  
  32. 'select   
  33.     row_number() over (order by   
  34.         (select sum(score) from dduser   
  35.                            where username=b.username) desc)   as 总排名,  
  36.     (select sum(score) from dduser where username=b.username) as 总得分,  
  37.     userDisplay as 昵称,  
  38.     username as 账号,  
  39.     '+@colname+'  
  40. from (select * from dduser) a   
  41. pivot (max(rank) for [monthin ('+@sql+')) b  
  42. group by username,userDisplay order by 总得分 desc')  
  43.   
  44. --扩展:如果时间要扩展的话,把month字段改个名字,存储YYYY-MM格式即可存储多个年限的了。  
0 0
原创粉丝点击