今天介绍4种列转行(又称宽表转长表、逆透视等)写法。

数据准备

CREATE TABLE Sales([Year] INT,Q1 INT,Q2 INT,Q3 INT,Q4 INT);
GO
INSERT INTO Sales([Year],Q1,Q2,Q3,Q4)VALUES (2017,12,123,324,123),(2018,13,455,324,878),(2019,29,786,473,633);

SQL写法

UNION

最传统最通用写法

SELECT [Year],'Q1' AS [Quarter],Q1 AS Amount FROM Sales UNION ALL
SELECT [Year],'Q2' AS [Quarter],Q2 AS Amount FROM Sales UNION ALL
SELECT [Year],'Q3' AS [Quarter],Q3 AS Amount FROM Sales UNION ALL
SELECT [Year],'Q4' AS [Quarter],Q4 AS Amount FROM Sales;
UNPIVOT

unpivot 的独特语法:

SELECT [Year],[Quarter],[Amount]
FROM Sales AS a
UNPIVOT(Amount FOR [Quarter] IN (Q1,Q2,Q3,Q4)) AS b;
CROSS JOIN

其实就是笛卡尔积,用CROSS JOIN是MSSQL的推荐写法,其它数据库若不支持此语法,可以将CROSS JOIN替换为逗号,或用Join On 1 = 1

SELECT a.[Year],b.[Quarter],CASE b.[Quarter] WHEN 'Q1' THEN Q1WHEN 'Q2' THEN Q2WHEN 'Q3' THEN Q3WHEN 'Q4' THEN Q4END AS Amout
FROM Sales a
CROSS JOIN (VALUES ('Q1'),('Q2'),('Q3'),('Q4')) AS b([Quarter]);
CROSS APPLY

CROSS APPLY是个强大的操作符,也可以用来实现unpivot:

SELECT a.[Year], b.[Quarter],b.Amount
FROM Sales a
CROSS APPLY (SELECT 'Q1' AS [Quarter],a.Q1 AS Amount UNION ALL SELECT 'Q2',a.Q2 UNION ALL SELECT 'Q3',a.Q3 UNION ALL SELECT 'Q4',a.Q4) AS b;
-- 或
SELECT a.[Year], b.[Quarter],b.Amount
FROM Sales a
CROSS APPLY (VALUES ('Q1',a.Q1),('Q2',a.Q2),('Q3',a.Q3),('Q4',a.Q4)) AS b([Quarter],Amount);

总结与说明

  • 传统的Union写法需要扫描多次基表,效率最差
  • UNPIVOT写法最简洁,而且执行效率高,但语法有点晦涩,不是SQL的典型风格
  • CROSS JOIN与CROSS APPLY写法也只要扫描一次基表,可能执行效率比UNPIVOT差一点点,但好处是语法上更灵活

SQL Server实现列转行相关推荐

  1. 【SQL Server】列转行 STUFF 函数

    一:首先说简单的示例,user表数据如下: id     name 1      张三 2     李四 3     王五 需求:现在需要把user表里的name全部合并成一列显示出来 SELECT ...

  2. SQL Server 2016 列存储技术做实时分析

    title: SQL Server 2016 列存储技术做实时分析 author: 风移 摘要 数据分析指导商业行为的价值越来越高,使得用户对数据实时分析的要求变得越来越高.使用传统RDBMS数据分析 ...

  3. SQL Server 关于列的权限控制

    SQL Server 关于列的权限控制 原文:SQL Server 关于列的权限控制 在SQL SERVER中列权限(Column Permissions)其实真没有什么好说的,但是好多人对这个都不甚 ...

  4. sql server新增列_SQL Server 2017中的新增功能

    sql server新增列 SQL Server 2017 is considered a major release in the history of the SQL Server life cy ...

  5. sql server新增列_SQL Server 2016安装中的新增功能?

    sql server新增列 SQL Server 2016 introduced officially on the 1st of June 2016. It comes with many new ...

  6. sql server伪列_伪简单SQL Server恢复模型

    sql server伪列 This article gives an overview of the Pseudo Simple SQL Server Recovery Model. It also ...

  7. SQL Server 索引列的顺序——真的没关系吗

    SQL Server 索引列的顺序--真的没关系吗 原文: SQL Server 索引列的顺序--真的没关系吗 翻译自:http://www.mssqltips.com/sqlservertip/27 ...

  8. SQL Server研习录(29)——sql server 设置列自增长

    SQL Server研习录(29)--sql server 设置列自增长 版权声明 一.设置列自增长 1.创建表时 2.创建表后 版权声明 本文原创作者:清风不渡 博客地址:https://blog. ...

  9. sql查询结果列转行

    SQL查询结果列转行 正常查询的结果如下图: 希望得到的结果如下图: SQL语句如下: SELECT SNAME,SUM(CASE WHEN CNAME = 'JAVA' THEN SCORE ELS ...

  10. 浅谈SQL Server identity列的操作方法

    SQL Server中,经常会用到Identity标识列,这种自增长的字段操作起来的确是比较方便.但它有时还会带来一些麻烦. 示例一:当表中被删除了某些数据的时候,自增长列的编号就不再是一个连线的数列 ...

最新文章

  1. tf.keras.losses.SquaredHinge 损失函数 示例
  2. 下面不属于python第三方库的安装方法的是-Python第三方库安装和卸载
  3. java 左边补0_java基础知识
  4. jquery 手型 鼠标穿过时_JS实现的鼠标跟随代码(卡通手型点击效果)
  5. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Clien
  6. python中image.open函数怎么用_详解Python中open()函数指定文件打开方式的用法
  7. 利用 pywin32 操作 excel
  8. C语言常用基础位操作
  9. cassandra常用操作总结
  10. 【PL/SQL】九九乘法口诀表
  11. 如何在 Mac 上更改 Safari 背景?
  12. ssm+共享图书管理系统 毕业设计-附源码151121
  13. 前端js加密、解密方法
  14. 先锋建筑设计师——庞嵚作品
  15. 音乐制作宿主软件-Cubase Elements 11.0.20 MacOS
  16. 1.1.人工智能的概念
  17. Unity实现人物移动和镜头跟随
  18. Adam,AdamW,LAMB优化器原理与代码
  19. 数仓的基本概念【精】
  20. H3C服务器带外默认账号和密码,H3C产品的默认密码是多少?

热门文章

  1. java set retainall_Java的Set集合中的retainAll()方法
  2. Ping/Pong Buffer in ARINC429 Block transmitting Mode
  3. 图灵、冯诺依曼谁才配得上计算机之父?
  4. github 设置语言为中文
  5. 如何使用3DMax球形化命令
  6. GEM TSU Interface Details and IEEE 1588 Support
  7. 软考中级软件设计师基础知识总结
  8. 极化码理论及算法研究2-什么是极化码?
  9. 上位机和下位机有什么区别和关系?常用上位机软件开发工具介绍
  10. 在计算机里的键盘叫什么名字,电脑键盘最长的一个键叫什么名字