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 oracle,sql多行转多列,中文没办法聚集的有关问题
sql多行转多列,中文没办法聚集的问题? 我要将下表 选项 答案 姓名 爱好 篮球 bruce 年龄 28 bruce 性别 ...
- SQL Server 行转列,列转行
一.多行转成一列(并以","隔开) 表名:A 表数据: 想要的查询结果: 查询语句: SELECT name ,value = ( STUFF(( SELECT ',' + val ...
- SQL Server 行转列,列转行。多行转成一列
一.多行转成一列(并以","隔开) 表名:A 表数据: 想要的查询结果: 查询语句: SELECT name ,value = ( STUFF(( SELECT ',' + val ...
- 做图表统计你需要掌握SQL Server 行转列和列转行
原文:做图表统计你需要掌握SQL Server 行转列和列转行 说在前面 做一个数据统计和分析的项目,每天面对着各种数据,经过存储过程从源表计算汇总后需要写入中间结果表以提高数据使用效率,那么此时就需 ...
- oracle 行转列的sql,Oracle行转列、列转行的Sql语句总结
目录结构如下: 行转列 列转行 [一].行转列 1.1.初始测试数据 表结构:TEST_TB_GRADE sql代码 create table TEST_TB_GRADE ( ID NUMBER(10 ...
- sqlserver中某列转成以逗号连接的字符串及逆转、数据行转列列转行
Sql Server 列转逗号隔开的字符串 和 逆转 https://www.cnblogs.com/duanyuerui/p/7567692.html Sql server 中将数据行转列列转行(一 ...
- SQL Server 行转列
SQL Server 行转列 继上次的列转行需求之后,最近又遇到一个行转列的需求.因为表设计的时候考虑到可能存在多类型的数据,但是其实最后使用只有固定的几种,所以前端界面也都是固定的.所以这个时候改表 ...
- Hive(行转列 列转行)
Hive(行转列 列转行) 行转列 行专列常用的几种方式有 collect_list collect_set 举例说明 原数据 sql SELECT concat_ws("|",c ...
- mysql 复杂行转列_有趣的SQL(四) 行转列的复杂应用和优化思想
原标题:有趣的SQL(四) 行转列的复杂应用和优化思想 导读 本文节选自松华老师<SQL优化专栏> 大家好,我是知数堂SQL 优化班老师 网名:骑龟的兔子 在之前的的系列文章:有趣的SQL ...
- mysql 复杂行转列_有趣的SQL(4) 行转列的复杂应用和优化思想
大家好,我是知数堂SQL 优化班老师 网名:骑龟的兔子 在之前的的系列文章中,有意思的SQL(3) 行转列,列转行和复制 已经给大家介绍了,行转列,列转行,复制等方法. 在这篇文章中,对其进行更深一层 ...
最新文章
- ICML2020 | 基于贝叶斯元学习在关系图上进行小样本关系抽取
- github开源项目分享
- 钉钉服务器端SDK PHP版
- 洛谷 - P4390 [BOI2007]Mokia 摩基亚(带修二维数点-四叉线段树/CDQ分治)
- Angular单元测试里使用fixture.debugElement测试UI界面元素
- 顺德机器人应用与维修专业收入_保定万维科技技校专业课程巡礼——计算机应用与维修...
- 服务器系统 比较,各种服务器操作系统比较
- Python跨目录引用模块(文件)
- Source Insight3.x注册码
- python怎么安装lxml库_lxml解析库的安装和使用
- 鼠标手势插件--smartUp
- 小O地图EXE版V0.9.5.5 - 功能总览
- Web 3.0让网络巨头们恐慌?Dapp爆发潮的到来会更让人颤抖!
- IOP、seata、zeebe分布式事务解决方案对比
- 雨润莲心:同幽梦、共红尘
- 2020 GDUT Rating Contest I (Div. 2) A.Cow Gymnastics
- 使用weinre调试移动端真机
- HTML中如何插入空格,HTML空格代码,多种HTML空格写法
- geth 区块同步 守护线程
- layui获取复选框的值
热门文章
- 计算机设备财产登记册,幼儿园财产登记制度
- Qt数据库应用3-数据打印到pdf
- ARINC 429总线学习资料?
- python3.5 爬取mzitu网站图片
- Dw cs6的详细下载安装教程对网页设计需要cs6的同学
- Docker基本管理--docker基本操作、镜像制作方法、私有仓库搭建、端口映射、容器互联、数据卷与数据卷容器
- 软考中级软件设计师--考试准备
- 【线上课程】4节课8小时培训,《白话区块链》作者蒋勇教你快速掌握区块链智能合约开发...
- WEB安全之代码安全----ESAPI
- 远程线程注入技术 屏蔽ctrl+alt+del