SQL行转列,列转行
我们都知道在sql查询中,union 是增行,join是增列,但是如果碰到需要行转列,列转行时,一味的使用 join来完成则会变的异常繁杂。如把一天24小时的行转换成列,则需要join24次,既不方便管理也使sql运行效率很慢,能脱裤子就解决的非要跑到高山游到海底
行转列
那么如何行转列呢,假如有一张表T,字段有name,subject,score,数据如下
Name | Subject | Score |
---|---|---|
小明 | 语文 | 30 |
小明 | 数学 | 22 |
小明 | 英语 | 66 |
小花 | 语文 | 30 |
小花 | 数学 | 33 |
小花 | 英语 | 67 |
转换成为 name,语文,数学,英语, 即 小明,30,30,30
Name | 语文 | 数学 | 英语 |
---|---|---|---|
小明 | 30 | 22 | 66 |
小花 | 30 | 33 | 67 |
这里就需要用到case when 以及 sum(max也可以,依据实际情况)
-- 遍历值,这里max也可以替换为sum
select name,max(case subject when '语文' then score else 0 end) as 语文,max(case subject when '数学' then score else 0 end) as 数学,max(case subject when '英语' then score else 0 end) as 英语
from T
group by name;
上面是从逻辑上来做处理,但是看起来相对麻烦,系统给了一种更为简洁的方法,PIVOT
SELECT *FROM TPIVOT (SUM(score) FOR subject IN (语文, 数学, 英语)
)
解释:就是for 循环subject列的语文,数学,英语等值求sum,并把语文等三个值作为列名,sum(score)作为对应列内容
列转行
列转行的需求就是把上面的行专列反过来一下。即把
Name | 语文 | 数学 | 英语 |
---|---|---|---|
小明 | 30 | 22 | 66 |
小花 | 30 | 33 | 67 |
转换为
Name | Subject | Score |
---|---|---|
小明 | 语文 | 30 |
小明 | 数学 | 22 |
小明 | 英语 | 66 |
小花 | 语文 | 30 |
小花 | 数学 | 33 |
小花 | 英语 | 67 |
最常见的一种列转行操作是采用UNION (UNION ALL) 进行并列操作,比如上面的需求可写为
SELECT Name, Subject, Score FROM T WHERE Name='小明' and Subject='语文'UNION ALL SELECT Name, Subject, Score FROM T WHERE Name='小明' and Subject='数学'UNION ALL SELECT Name, Subject, Score FROM T WHERE Name='小明' and Subject='英语'UNION ALL SELECT Name, Subject, Score FROM T WHERE Name='小花' and Subject='语文'UNION ALL SELECT Name, Subject, Score FROM T WHERE Name='小花' and Subject='数学'UNION ALL SELECT Name, Subject, Score FROM T WHERE Name='小花' and Subject='英语'
上面这种写法,方便易用好理解,但是相对冗余,不建议高级开发者使用,我们可以用更高级一点语法,就是与PIVOT对应的UNPIVOT
SELECT *FROM T
UNPIVOT (score FOR subject IN (语文, 数学, 英语)
)
解释:就是for 循环subject(列名自定义)的语文,数学,英语等列求score,并把作为subject列名,语文,数学,英语作为列内容
SQL行转列,列转行相关推荐
- sql行并列,列分行
将一个字段","分割的数据进行多列展示: SELECT REGEXP_SUBSTR (T.TEXTBOOK_IDS,'[^,]+',1,LEVEL) TEXTBOOK_ID FRO ...
- SQL Server 行转列,列转行。多行转成一列
一.多行转成一列(并以","隔开) 表名:A 表数据: 想要的查询结果: 查询语句: SELECT name ,value = ( STUFF(( SELECT ',' + val ...
- SQL 行转列 列转行 Oracle转置函数函数pivot、unpivot 解决wm_concat 没有排序
https://www.cnblogs.com/mellowsmile/p/4642306.html HH 终风且暴,顾我则笑,谑浪笑敖,中心是悼. 终风且霾,惠然肯来,莫往莫来,悠悠我思. 博客园 ...
- SQL——行转列,列转行
重温SQL--行转列,列转行 行转列,列转行是我们在开发过程中经常碰到的问题.行转列一般通过CASE WHEN 语句来实现,也可以通过 SQL SERVER 2005 新增的运算符PIVOT来实现. ...
- 使用case when,union all实现sql行转列、列转行
以前有写过行转列,列转行的博客 具体见: https://blog.csdn.net/weixin_38653290/article/details/84639754 今天分享下使用case when ...
- SQL 行转列 和 列转行 整理
SQL 列转行 和行转列 列转多行场景: 表中的某个字段是由多个字符串拼接而成,需要按照每个拼接的字符串转换成多行,比如 :[手机品牌]字段里的内容是 小米,华为,苹果:按照这个几个类别进行分组: ...
- SQL行转列、列转行
SQL行转列.列转行 这个主题还是比较常见的,行转列主要适用于对数据作聚合统计,如统计某类目的商品在某个时间区间的销售情况.列转行问题同样也很常见. 一.整理测试数据 create table wyc ...
- sqlserver中某列转成以逗号连接的字符串及逆转、数据行转列列转行
Sql Server 列转逗号隔开的字符串 和 逆转 https://www.cnblogs.com/duanyuerui/p/7567692.html Sql server 中将数据行转列列转行(一 ...
- 死磕:SQL行转列汇总(全网最全最详细)
SQL行转列汇总 阅读目录 一. 基础语法: 二. 典型实例 一. 基础语法: PIVOT 用于将列值旋转为列名(即行转列),在 SQL Server 2000可以用聚合函数配合CASE语句实现 PI ...
最新文章
- 2022-2028年中国婴儿用品市场投资分析及前景预测报告
- python-virtualenv虚拟环境的使用
- ACP-PMP备考交流
- 程序员怎样才能写出一篇好的技术文章
- git丢弃本地修改的所有文件(新增、删除、修改)
- java 组合代码_java实现Composite组合模式的实例代码
- SQL 使用总结五(杂记)
- cadence 常见pcb电阻_不加端接电阻的快乐,你们绝对想象不到!
- 使用Homebrew安装Git与Github在idea中的配置
- awl 多线程syn***
- List集合之LinkedList
- 基于Fragstats的土地利用景观格局分析
- python 创建nc文件,包含经纬度
- 香农码字matlab,matlab实现香农编码
- Web服务器环境的搭建
- IDEA maven项目使用Junit报错 java: 程序包org.junit不存在
- 【RPA自动化|提升办公效率】无需代码的傻瓜式爬虫
- 2013年图灵奖得主 Leslie Lamport 专访:程序员需要更多的数学知识
- 生活小妙方记录:治疗缠腰蛇
- 16省8-四平方和(四平方和定理,又称为拉格朗日定理: 每个正整数都可以表示为至多4个正整数的平方和。 如果把0包括进去,就正好可以表示为4个数的平方和。 比如:)