zoukankan      html  css  js  c++  java
  • SQL大圣之路笔记——SQL 行转列,列转行

      1
     1 --------------------------------结果------------------------------------------------------------------------------------
     2 姓名         课程         分数
     3 ---------- ---------- -----------
     4 张三         语文         74
     5 张三         数学         83
     6 张三         物理         93
     7 李四         语文         74
     8 李四         数学         84
     9 李四         物理         94
    10 
    11 (6 行受影响)
    12 
    13 
    14 //现在的问题是:我想根据姓名统计这个人的三门成绩,即:姓名   语文   数学  物理
    15 //首先看看使用case when end结构的时候:
    16 
    17 select 姓名,
    18  max(case 课程 when '语文' then 分数 else 0 end)语文,
    19  max(case 课程 when '数学'then 分数 else 0 end)数学,
    20  max(case 课程 when '物理'then 分数 else 0 end)物理
    21 from tb
    22 group by 姓名
    23 --------------------------------结果------------------------------------------------------------------------------------
    24 姓名         语文          数学          物理
    25 ---------- ----------- ----------- -----------
    26 李四         74          84          94
    27 张三         74          83          93
    28 
    29 (2 行受影响)
    30 
    31 //这个结果就是我们想要的,然后再看看使用pivot:
    32 
    33 select * from tb pivot(max(分数) for 课程 in (语文,数学,物理))a
    34 --------------------------------结果------------------------------------------------------------------------------------
    35 姓名         语文          数学          物理
    36 ---------- ----------- ----------- -----------
    37 李四         74          84          94
    38 张三         74          83          93
    39 
    40 (2 行受影响)
    41 
    42 //哇,结果一模一样!这个就是我想用的结果。


      /*普通行列转换 2 (爱新觉罗.毓华 2007-11-18于海南三亚) 3 4 假设有张学生成绩表(tb)如下: 5 Name Subject Result 6 张三 语文  74 7 张三 数学  83 8 张三 物理  93 9 李四 语文  74 10 李四 数学  84 11 李四 物理  94 12 */ 13 14 ------------------------------------------------------------------------- 15 /* 16 想变成 17 姓名 语文 数学 物理 18 ---------- ----------- ----------- ----------- 19 李四 74 84 94 20 张三 74 83 93 21 */ 22 23 create table tb 24 ( 25 Name varchar(10) , 26 Subject varchar(10) , 27 Result int 28 ) 29 30 insert into tb(Name , Subject , Result) values('张三' , '语文' , 74) 31 insert into tb(Name , Subject , Result) values('张三' , '数学' , 83) 32 insert into tb(Name , Subject , Result) values('张三' , '物理' , 93) 33 insert into tb(Name , Subject , Result) values('李四' , '语文' , 74) 34 insert into tb(Name , Subject , Result) values('李四' , '数学' , 84) 35 insert into tb(Name , Subject , Result) values('李四' , '物理' , 94) 36 go 37 38 --静态SQL,指subject只有语文、数学、物理这三门课程。 39 select name 姓名, 40 max(case subject when '语文' then result else 0 end) 语文, 41 max(case subject when '数学' then result else 0 end) 数学, 42 max(case subject when '物理' then result else 0 end) 物理 43 from tb 44 group by name 45 /* 46 姓名 语文 数学 物理 47 ---------- ----------- ----------- ----------- 48 李四 74 84 94 49 张三 74 83 93 50 */ 51 52 --动态SQL,指subject不止语文、数学、物理这三门课程。 53 declare @sql varchar(8000) 54 set @sql = 'select Name as ' + '姓名' 55 select @sql = @sql + ' , max(case Subject when ''' + Subject + ''' then Result else 0 end) [' + Subject + ']' 56 from (select distinct Subject from tb) as a 57 set @sql = @sql + ' from tb group by name' 58 exec(@sql) 59 /* 60 姓名 数学 物理 语文 61 ---------- ----------- ----------- ----------- 62 李四 84 94 74 63 张三 83 93 74 64 */ 65 66 ------------------------------------------------------------------- 67 /*加个平均分,总分 68 姓名 语文 数学 物理 平均分 总分 69 ---------- ----------- ----------- ----------- -------------------- ----------- 70 李四 74 84 94 84.00 252 71 张三 74 83 93 83.33 250 72 */ 73 74 --静态SQL,指subject只有语文、数学、物理这三门课程。 75 select name 姓名, 76 max(case subject when '语文' then result else 0 end) 语文, 77 max(case subject when '数学' then result else 0 end) 数学, 78 max(case subject when '物理' then result else 0 end) 物理, 79 cast(avg(result*1.0) as decimal(18,2)) 平均分, 80 sum(result) 总分 81 from tb 82 group by name 83 /* 84 姓名 语文 数学 物理 平均分 总分 85 ---------- ----------- ----------- ----------- -------------------- ----------- 86 李四 74 84 94 84.00 252 87 张三 74 83 93 83.33 250 88 */ 89 90 --动态SQL,指subject不止语文、数学、物理这三门课程。 91 declare @sql1 varchar(8000) 92 set @sql1 = 'select Name as ' + '姓名' 93 select @sql1 = @sql1 + ' , max(case Subject when ''' + Subject + ''' then Result else 0 end) [' + Subject + ']' 94 from (select distinct Subject from tb) as a 95 set @sql1 = @sql1 + ' , cast(avg(result*1.0) as decimal(18,2)) 平均分,sum(result) 总分 from tb group by name' 96 exec(@sql1) 97 /* 98 姓名 数学 物理 语文 平均分 总分 99 ---------- ----------- ----------- ----------- -------------------- ----------- 100 李四 84 94 74 84.00 252 101 张三 83 93 74 83.33 250 102 */ 103 104 drop table tb 105 106 --------------------------------------------------------- 107 --------------------------------------------------------- 108 /* 109 如果上述两表互相换一下:即 110 111 姓名 语文 数学 物理 112 张三 74  83  93 113 李四 74  84  94 114 115 想变成 116 Name Subject Result 117 ---------- ------- ----------- 118 李四 语文 74 119 李四 数学 84 120 李四 物理 94 121 张三 语文 74 122 张三 数学 83 123 张三 物理 93 124 */ 125 126 create table tb1 127 ( 128 姓名 varchar(10) , 129 语文 int , 130 数学 int , 131 物理 int 132 ) 133 134 insert into tb1(姓名 , 语文 , 数学 , 物理) values('张三',74,83,93) 135 insert into tb1(姓名 , 语文 , 数学 , 物理) values('李四',74,84,94) 136 137 select * from 138 ( 139 select 姓名 as Name , Subject = '语文' , Result = 语文 from tb1 140 union all 141 select 姓名 as Name , Subject = '数学' , Result = 数学 from tb1 142 union all 143 select 姓名 as Name , Subject = '物理' , Result = 物理 from tb1 144 ) t 145 order by name , case Subject when '语文' then 1 when '数学' then 2 when '物理' then 3 when '总分' then 4 end 146 147 -------------------------------------------------------------------- 148 /*加个平均分,总分 149 Name Subject Result 150 ---------- ------- -------------------- 151 李四 语文 74.00 152 李四 数学 84.00 153 李四 物理 94.00 154 李四 平均分 84.00 155 李四 总分 252.00 156 张三 语文 74.00 157 张三 数学 83.00 158 张三 物理 93.00 159 张三 平均分 83.33 160 张三 总分 250.00 161 */ 162 163 select * from 164 ( 165 select 姓名 as Name , Subject = '语文' , Result = 语文 from tb1 166 union all 167 select 姓名 as Name , Subject = '数学' , Result = 数学 from tb1 168 union all 169 select 姓名 as Name , Subject = '物理' , Result = 物理 from tb1 170 union all 171 select 姓名 as Name , Subject = '平均分' , Result = cast((语文 + 数学 + 物理)*1.0/3 as decimal(18,2)) from tb1 172 union all 173 select 姓名 as Name , Subject = '总分' , Result = 语文 + 数学 + 物理 from tb1 174 ) t 175 order by name , case Subject when '语文' then 1 when '数学' then 2 when '物理' then 3 when '平均分' then 4 when '总分' then 5 end 176 177 drop table tb1
  • 相关阅读:
    Android开发四大组件--Activity详解
    <base target="_blank"/>
    MVC EF异常-“序列化类型为 XX 的对象时检测到循环引用”
    错误:[将截断字符串或二进制数据。 语句已终止。]
    EasyUI queryParams属性 在请求远程数据同时给action方法传参
    存储区更新、插入或删除语句影响到了意外的行数(0)。实体在加载后可能被修改或删除。
    easyui DateTimeBox 取值
    [转载]再次谈谈easyui datagrid 的数据加载
    EasyUI datagrid 改变url属性 实现动态加载数据
    在js中获取easyui datagrid的数据
  • 原文地址:https://www.cnblogs.com/allenzhang/p/5473285.html
Copyright © 2011-2022 走看看