SQLServer实现列转行

更新时间:2023-07-25 23:40:34 阅读: 评论:0

太阳能的应用SQLServer 实现列转⾏
今天介绍4种列转⾏(⼜称宽表转长表、逆透视等)写法。
数据准备
SQL 写法
UNION
最传统最通⽤写法
小芳歌词
UNPIVOT
unpivot 的独特语法:
CROSS JOIN CREATE  TABLE  Sales ([Year ] INT ,Q1 INT ,Q2 INT ,Q3 INT ,Q4 INT );
彩铅画人物GO
INSERT  INTO  Sales ([Year ],Q1,Q2,Q3,Q4)常吃土豆有7大好处
VALUES  (2017,12,123,324,123)
,(2018,13,455,324,878)
,(2019,29,786,473,633);
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 ;
SELECT  [Year ],[Quarter ],[Amount ]
似曾相识燕归来的上一句FROM  Sales AS  a
UNPIVOT (Amount FOR  [Quarter ] IN  (Q1,Q2,Q3,Q4)) AS  b ;
其实就是笛卡尔积,⽤CROSS JOIN是MSSQL的推荐写法,其它数据库若不⽀持此语法,可以将CROSS JOIN替换为逗号,或⽤Join On 1 = 1
SELECT a.[Year],b.[Quarter]
,CASE b.[Quarter]
WHEN'Q1'THEN Q1
WHEN'Q2'THEN Q2
WHEN'Q3'THEN Q3
WHEN'Q4'THEN Q4
昆虫标本制作方法END 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差⼀点点,但好处是语法上更灵活

本文发布于:2023-07-25 23:40:34,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1117185.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:写法   基表   扫描
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图