分类目录

链接

2011 年 6 月
 12345
6789101112
13141516171819
20212223242526
27282930  

近期文章

热门标签

新人福利,免费薅羊毛

现在位置:    首页 > MySQL, SQL Server > 正文
SQL 列转行
MySQL, SQL Server 暂无评论 阅读(9,265)
  1. --SQL 列转行
  2. -----------------------------------
  3. --普通行列转换 
  4. --数据库之家:http://blog.peos.cn/ 
  5. ------------------------------
  6.  
  7. 假设有张学生成绩表(tb)如下:
  8. Name Subject Result
  9. 张三 语文  74
  10. 张三 数学  83
  11. 张三 物理  93
  12. 李四 语文  74
  13. 李四 数学  84
  14. 李四 物理  94
  15. */
  16.  
  17. -------------------------------------------------------------------------
  18. /*
  19. 想变成
  20. 姓名         语文        数学        物理
  21. ---------- ----------- ----------- -----------
  22. 李四         74          84          94
  23. 张三         74          83          93
  24. */
  25.  
  26. create table tb
  27. (
  28.    Name    varchar(10) ,
  29.    Subject varchar(10) ,
  30.    Result  int
  31. )
  32.  
  33. insert into tb(Name , Subject , Result) values('张三' , '语文' , 74)
  34. insert into tb(Name , Subject , Result) values('张三' , '数学' , 83)
  35. insert into tb(Name , Subject , Result) values('张三' , '物理' , 93)
  36. insert into tb(Name , Subject , Result) values('李四' , '语文' , 74)
  37. insert into tb(Name , Subject , Result) values('李四' , '数学' , 84)
  38. insert into tb(Name , Subject , Result) values('李四' , '物理' , 94)
  39. go
  40.  
  41. --静态SQL,指subject只有语文、数学、物理这三门课程。
  42. select name 姓名,
  43.   max(case subject when '语文' then result else 0 end) 语文,
  44.   max(case subject when '数学' then result else 0 end) 数学,
  45.   max(case subject when '物理' then result else 0 end) 物理
  46. from tb
  47. group by name
  48. /*
  49. 姓名         语文        数学        物理
  50. ---------- ----------- ----------- -----------
  51. 李四         74          84          94
  52. 张三         74          83          93
  53. */
  54.  
  55. --动态SQL,指subject不止语文、数学、物理这三门课程。
  56. declare @sql varchar(8000)
  57. set @sql = 'select Name as ' + '姓名'
  58. select @sql = @sql + ' , max(case Subject when ''' + Subject + ''' then Result else 0 end) [' + Subject + ']'
  59. from (select distinct Subject from tb) as a
  60. set @sql = @sql + ' from tb group by name'
  61. exec(@sql)
  62. /*
  63. 姓名         数学        物理        语文
  64. ---------- ----------- ----------- -----------
  65. 李四         84          94          74
  66. 张三         83          93          74
  67. */
  68.  
  69. -------------------------------------------------------------------
  70. /*加个平均分,总分
  71. 姓名         语文        数学        物理        平均分                总分
  72. ---------- ----------- ----------- ----------- -------------------- -----------
  73. 李四         74          84          94          84.00                252
  74. 张三         74          83          93          83.33                250
  75. */
  76.  
  77. --静态SQL,指subject只有语文、数学、物理这三门课程。
  78. select name 姓名,
  79.   max(case subject when '语文' then result else 0 end) 语文,
  80.   max(case subject when '数学' then result else 0 end) 数学,
  81.   max(case subject when '物理' then result else 0 end) 物理,
  82.   cast(avg(result*1.0) as decimal(18,2)) 平均分,
  83.   sum(result) 总分
  84. from tb
  85. group by name
  86. /*
  87. 姓名         语文        数学        物理        平均分                总分
  88. ---------- ----------- ----------- ----------- -------------------- -----------
  89. 李四         74          84          94          84.00                252
  90. 张三         74          83          93          83.33                250
  91. */
  92.  
  93. --动态SQL,指subject不止语文、数学、物理这三门课程。
  94. declare @sql1 varchar(8000)
  95. set @sql1 = 'select Name as ' + '姓名'
  96. select @sql1 = @sql1 + ' , max(case Subject when ''' + Subject + ''' then Result else 0 end) [' + Subject + ']'
  97. from (select distinct Subject from tb) as a
  98. set @sql1 = @sql1 + ' , cast(avg(result*1.0) as decimal(18,2)) 平均分,sum(result) 总分 from tb group by name'
  99. exec(@sql1)
  100. /*
  101. 姓名         数学        物理        语文        平均分                总分
  102. ---------- ----------- ----------- ----------- -------------------- -----------
  103. 李四         84          94          74          84.00                252
  104. 张三         83          93          74          83.33                250
  105. */
  106.  
  107. drop table tb    
  108.  
  109. ---------------------------------------------------------
  110. ---------------------------------------------------------
  111. /*
  112. 如果上述两表互相换一下:即
  113.  
  114. 姓名 语文 数学 物理
  115. 张三 74  83  93
  116. 李四 74  84  94
  117.  
  118. 想变成
  119. Name       Subject Result
  120. ---------- ------- -----------
  121. 李四         语文      74
  122. 李四         数学      84
  123. 李四         物理      94
  124. 张三         语文      74
  125. 张三         数学      83
  126. 张三         物理      93
  127. */
  128.  
  129. create table tb1
  130. (
  131.    姓名 varchar(10) ,
  132.    语文 int ,
  133.    数学 int ,
  134.    物理 int
  135. )
  136.  
  137. insert into tb1(姓名 , 语文 , 数学 , 物理) values('张三',74,83,93)
  138. insert into tb1(姓名 , 语文 , 数学 , 物理) values('李四',74,84,94)
  139.  
  140. select * from
  141. (
  142.   select 姓名 as Name , Subject = '语文' , Result = 语文 from tb1
  143.   union all
  144.   select 姓名 as Name , Subject = '数学' , Result = 数学 from tb1
  145.   union all
  146.   select 姓名 as Name , Subject = '物理' , Result = 物理 from tb1
  147. ) t
  148. order by name , case Subject when '语文' then 1 when '数学' then 2 when '物理' then 3 when '总分' then 4 end
  149.  
  150. --------------------------------------------------------------------
  151. /*加个平均分,总分
  152. Name       Subject     Result
  153. ---------- -------    --------------------
  154. 李四         语文      74.00
  155. 李四         数学      84.00
  156. 李四         物理      94.00
  157. 李四         平均分    84.00
  158. 李四         总分      252.00
  159. 张三         语文      74.00
  160. 张三         数学      83.00
  161. 张三         物理      93.00
  162. 张三         平均分    83.33
  163. 张三         总分      250.00
  164. */
  165.  
  166. select * from
  167. (
  168.   select 姓名 as Name , Subject = '语文' , Result = 语文 from tb1
  169.   union all
  170.   select 姓名 as Name , Subject = '数学' , Result = 数学 from tb1
  171.   union all
  172.   select 姓名 as Name , Subject = '物理' , Result = 物理 from tb1
  173.   union all
  174.   select 姓名 as Name , Subject = '平均分' , Result = cast((语文 + 数学 + 物理)*1.0/3 as decimal(18,2)) from tb1
  175.   union all
  176.   select 姓名 as Name , Subject = '总分' , Result = 语文 + 数学 + 物理 from tb1
  177. ) t
  178. order by name , case Subject when '语文' then 1 when '数学' then 2 when '物理' then 3 when '平均分' then 4 when '总分' then 5 end
  179.  
  180. drop table tb1

============ 欢迎各位老板打赏~ ===========

本文版权归Bruce's Blog所有,转载引用请完整注明以下信息:
本文作者:Bruce
本文地址:SQL 列转行 | Bruce's Blog

发表评论

留言无头像?