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

转载于:https://www.cnblogs.com/allenzhang/p/5473285.html

SQL大圣之路笔记——SQL 行转列,列转行相关推荐

  1. SQL大圣之路笔记——SQL 创建索引 index

    1 --创建索引的标准:根据实际的sql语句进行分析,'列'出现在where中的次数较多,时间损耗较大,则为这个'列'建立索引, 2 3 --注意:不是越多越好,因为没建立一个'列'索引,都要排序存储 ...

  2. SQL大圣之路笔记——PowerDesigner之新建table、view、proc

    1. 新建table.view.proc 转载于:https://www.cnblogs.com/allenzhang/p/6305564.html

  3. c#大圣之路笔记——c# SqlDataReader和SqlDataAdapter区别

    SqlDataReader 高效,功能弱,只读访问 SqlDataAdapter 强大,要求资源也大一点 SqlDataReader 只能在保持跟数据库连接的状态下才可以读取... SqlDataAd ...

  4. sql拼接字段,拼接同1行的不同列,拼接同1列的不同行

    一.常见需求1,拼接同1行的不同列 1.CONCAT(str1,str2,-)                         返回结果为连接参数产生的字符串.如有任何一个参数为NULL ,则返回值为 ...

  5. MIT线性代数笔记一 行图像和列图像

    文章目录 1. 曾经 2. 现在 3. 第一讲 行图像和列图像 3.1 行图像 3.2 列图像 1. 曾经   若干年前,有一个年轻的男老师(王清老师)给我们讲线性代数.他讲课的声音比较小,坐到后面接 ...

  6. 数仓知识10:数据库存储的两种方式-行存储和列存储

    0. 前言 目前大数据存储主要有两种方案可供选择:行存储(Row-Based)和列存储(Column-Based).业界对两种方案有许多争持,争论的焦点是:谁能够更有效地处理海量数据,且兼顾安全.可靠 ...

  7. 大数据进阶之路——Spark SQL 之 DataFrameDataset

    文章目录 dataframe 和 rdd API常用操作 DataFrame和RDD 案例 DataSet DataFrame它不是Spark SQL提出的,而是早起在R.Pandas语言就已经有了的 ...

  8. 大数据之路读书笔记-03数据同步

    大数据之路读书笔记-03数据同步 如第一章所述,我们将数据采集分为日志采集和数据库数据同步两部分.数据同步技术更通用的含义是不同系统间的数据流转,有多种不同的应用场景.主数据库与备份数据库之间的数据备 ...

  9. 大数据之路读书笔记-10维度设计

    大数据之路读书笔记-10维度设计 文章目录 大数据之路读书笔记-10维度设计 10.1 维度设计基础 10.1.1 维度的基本概念 10.1.2 维度的基本设计方法 10.1.3 维度的层次结构 10 ...

  10. 大数据之路读书笔记-11事实表设计

    大数据之路读书笔记-11事实表设计 文章目录 大数据之路读书笔记-11事实表设计 11.1 事实表基础 11.1.1 事实表特性 11.1.2 事实表设计原则 11.1.3 事实表设计方法 11.2 ...

最新文章

  1. Java课程主观题作业_JAVA课程作业01
  2. 7-4 BCD解密(C语言)
  3. JavaScript 函数声明,函数表达式,匿名函数,立即执行函数之区别
  4. CTF基础理论知识02
  5. java 课后习题 键入日期输入星期几
  6. UVa 11998 破碎的键盘(数组实现链表)
  7. Spring的事务机制
  8. [stm32] 利用uc-gui封装画图和画线函数移植51上的模拟动画
  9. Android应用开发-MP3音乐播放器代码实现(三)
  10. YUI 3:Node
  11. java生成图表_【JAVA】POI生成EXCEL图表(柱状图、折线等)
  12. html5 讯飞离线语音包,讯飞输入法离线语音怎么用?讯飞输入法离线语音开启方法...
  13. 《从Paxos到Zookeeper分布式一致性原理与实践》读书笔记
  14. 今天测试twm000 850的windows7 记录
  15. Debian搭建SVN服务器
  16. 相亲app开发,解决内存循环引用的问题
  17. ⚡️狂神Linux学习笔记
  18. Unity读取数据库的简单思路
  19. QML Tumbler开发实践--字体选择循环列表
  20. 机器学习中的Bias和Variance是指什么

热门文章

  1. @RequestParam使用须知
  2. Material使用09 MdCheckboxModule、MdMenuModule、MdTooltipModule
  3. java JVM常见的四大异常及处理方案
  4. hdu 3746 kmp求循环节
  5. CentOS安装MySQL问题汇总
  6. NSRange类详解
  7. 07网络发展趋势:风险和机遇并存
  8. Apache 2.4.28的安装
  9. 解决chrome崩溃的方法
  10. 负载均衡—实现配置篇(Nginx)