我们都知道在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行转列,列转行相关推荐

  1. sql行并列,列分行

    将一个字段","分割的数据进行多列展示: SELECT REGEXP_SUBSTR (T.TEXTBOOK_IDS,'[^,]+',1,LEVEL) TEXTBOOK_ID FRO ...

  2. SQL Server 行转列,列转行。多行转成一列

    一.多行转成一列(并以","隔开) 表名:A 表数据: 想要的查询结果: 查询语句: SELECT name ,value = ( STUFF(( SELECT ',' + val ...

  3. SQL 行转列 列转行 Oracle转置函数函数pivot、unpivot 解决wm_concat 没有排序

    https://www.cnblogs.com/mellowsmile/p/4642306.html HH 终风且暴,顾我则笑,谑浪笑敖,中心是悼. 终风且霾,惠然肯来,莫往莫来,悠悠我思. 博客园 ...

  4. SQL——行转列,列转行

    重温SQL--行转列,列转行 行转列,列转行是我们在开发过程中经常碰到的问题.行转列一般通过CASE WHEN 语句来实现,也可以通过 SQL SERVER 2005 新增的运算符PIVOT来实现. ...

  5. 使用case when,union all实现sql行转列、列转行

    以前有写过行转列,列转行的博客 具体见: https://blog.csdn.net/weixin_38653290/article/details/84639754 今天分享下使用case when ...

  6. SQL 行转列 和 列转行 整理

    SQL 列转行 和行转列 列转多行场景: ​ 表中的某个字段是由多个字符串拼接而成,需要按照每个拼接的字符串转换成多行,比如 :[手机品牌]字段里的内容是 小米,华为,苹果:按照这个几个类别进行分组: ...

  7. SQL行转列、列转行

    SQL行转列.列转行 这个主题还是比较常见的,行转列主要适用于对数据作聚合统计,如统计某类目的商品在某个时间区间的销售情况.列转行问题同样也很常见. 一.整理测试数据 create table wyc ...

  8. sqlserver中某列转成以逗号连接的字符串及逆转、数据行转列列转行

    Sql Server 列转逗号隔开的字符串 和 逆转 https://www.cnblogs.com/duanyuerui/p/7567692.html Sql server 中将数据行转列列转行(一 ...

  9. 死磕:SQL行转列汇总(全网最全最详细)

    SQL行转列汇总 阅读目录 一. 基础语法: 二. 典型实例 一. 基础语法: PIVOT 用于将列值旋转为列名(即行转列),在 SQL Server 2000可以用聚合函数配合CASE语句实现 PI ...

最新文章

  1. 2022-2028年中国婴儿用品市场投资分析及前景预测报告
  2. python-virtualenv虚拟环境的使用
  3. ACP-PMP备考交流
  4. 程序员怎样才能写出一篇好的技术文章
  5. git丢弃本地修改的所有文件(新增、删除、修改)
  6. java 组合代码_java实现Composite组合模式的实例代码
  7. SQL 使用总结五(杂记)
  8. cadence 常见pcb电阻_不加端接电阻的快乐,你们绝对想象不到!
  9. 使用Homebrew安装Git与Github在idea中的配置
  10. awl 多线程syn***
  11. List集合之LinkedList
  12. 基于Fragstats的土地利用景观格局分析
  13. python 创建nc文件,包含经纬度
  14. 香农码字matlab,matlab实现香农编码
  15. Web服务器环境的搭建
  16. IDEA maven项目使用Junit报错 java: 程序包org.junit不存在
  17. 【RPA自动化|提升办公效率】无需代码的傻瓜式爬虫
  18. 2013年图灵奖得主 Leslie Lamport 专访:程序员需要更多的数学知识
  19. 生活小妙方记录:治疗缠腰蛇
  20. 16省8-四平方和(四平方和定理,又称为拉格朗日定理: 每个正整数都可以表示为至多4个正整数的平方和。 如果把0包括进去,就正好可以表示为4个数的平方和。 比如:)

热门文章

  1. 2021年全球望远镜收入大约1161.6百万美元,预计2028年达到1275百万美元
  2. Windows系统下如何查看Python是否安装成功
  3. java中string长度有限制吗,最大是多少?
  4. 中国计算机学会推荐中文科技期刊目录(2019年)
  5. unity 卡通风格渲染
  6. MySQL 删除数据库
  7. js 获取ip地址进行跳转
  8. OSPF 多区域原理与配置
  9. C++中的getline()函数
  10. iOS逆向重签名(三):微信重签名