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
转载于:https://www.cnblogs.com/allenzhang/p/5473285.html
SQL大圣之路笔记——SQL 行转列,列转行相关推荐
- SQL大圣之路笔记——SQL 创建索引 index
1 --创建索引的标准:根据实际的sql语句进行分析,'列'出现在where中的次数较多,时间损耗较大,则为这个'列'建立索引, 2 3 --注意:不是越多越好,因为没建立一个'列'索引,都要排序存储 ...
- SQL大圣之路笔记——PowerDesigner之新建table、view、proc
1. 新建table.view.proc 转载于:https://www.cnblogs.com/allenzhang/p/6305564.html
- c#大圣之路笔记——c# SqlDataReader和SqlDataAdapter区别
SqlDataReader 高效,功能弱,只读访问 SqlDataAdapter 强大,要求资源也大一点 SqlDataReader 只能在保持跟数据库连接的状态下才可以读取... SqlDataAd ...
- sql拼接字段,拼接同1行的不同列,拼接同1列的不同行
一.常见需求1,拼接同1行的不同列 1.CONCAT(str1,str2,-) 返回结果为连接参数产生的字符串.如有任何一个参数为NULL ,则返回值为 ...
- MIT线性代数笔记一 行图像和列图像
文章目录 1. 曾经 2. 现在 3. 第一讲 行图像和列图像 3.1 行图像 3.2 列图像 1. 曾经 若干年前,有一个年轻的男老师(王清老师)给我们讲线性代数.他讲课的声音比较小,坐到后面接 ...
- 数仓知识10:数据库存储的两种方式-行存储和列存储
0. 前言 目前大数据存储主要有两种方案可供选择:行存储(Row-Based)和列存储(Column-Based).业界对两种方案有许多争持,争论的焦点是:谁能够更有效地处理海量数据,且兼顾安全.可靠 ...
- 大数据进阶之路——Spark SQL 之 DataFrameDataset
文章目录 dataframe 和 rdd API常用操作 DataFrame和RDD 案例 DataSet DataFrame它不是Spark SQL提出的,而是早起在R.Pandas语言就已经有了的 ...
- 大数据之路读书笔记-03数据同步
大数据之路读书笔记-03数据同步 如第一章所述,我们将数据采集分为日志采集和数据库数据同步两部分.数据同步技术更通用的含义是不同系统间的数据流转,有多种不同的应用场景.主数据库与备份数据库之间的数据备 ...
- 大数据之路读书笔记-10维度设计
大数据之路读书笔记-10维度设计 文章目录 大数据之路读书笔记-10维度设计 10.1 维度设计基础 10.1.1 维度的基本概念 10.1.2 维度的基本设计方法 10.1.3 维度的层次结构 10 ...
- 大数据之路读书笔记-11事实表设计
大数据之路读书笔记-11事实表设计 文章目录 大数据之路读书笔记-11事实表设计 11.1 事实表基础 11.1.1 事实表特性 11.1.2 事实表设计原则 11.1.3 事实表设计方法 11.2 ...
最新文章
- Java课程主观题作业_JAVA课程作业01
- 7-4 BCD解密(C语言)
- JavaScript 函数声明,函数表达式,匿名函数,立即执行函数之区别
- CTF基础理论知识02
- java 课后习题 键入日期输入星期几
- UVa 11998 破碎的键盘(数组实现链表)
- Spring的事务机制
- [stm32] 利用uc-gui封装画图和画线函数移植51上的模拟动画
- Android应用开发-MP3音乐播放器代码实现(三)
- YUI 3:Node
- java生成图表_【JAVA】POI生成EXCEL图表(柱状图、折线等)
- html5 讯飞离线语音包,讯飞输入法离线语音怎么用?讯飞输入法离线语音开启方法...
- 《从Paxos到Zookeeper分布式一致性原理与实践》读书笔记
- 今天测试twm000 850的windows7 记录
- Debian搭建SVN服务器
- 相亲app开发,解决内存循环引用的问题
- ⚡️狂神Linux学习笔记
- Unity读取数据库的简单思路
- QML Tumbler开发实践--字体选择循环列表
- 机器学习中的Bias和Variance是指什么