UNPIVOT的详细说明
生活随笔
收集整理的這篇文章主要介紹了
UNPIVOT的详细说明
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
unpivot包含3步:1.生成拷貝 2.提取數據 3.過濾不相關的數據 第一步,把每行數據都打散開來,用CROSS JOIN實現 {(1,A),(1,B),(1,C),(1,D)} {(2,A),(2,B),(2,C),(2,D)} ....................2008語法 SELECT *
FROM dbo.EmpCustOrders
CROSS JOIN (VALUES('A'),('B'),('C'),('D')) AS Custs(custid);
原本的語法 SELECT *
FROM dbo.EmpCustOrders
CROSS JOIN (SELECT 'A' AS custid
UNION ALL SELECT 'B'
UNION ALL SELECT 'C'
UNION ALL SELECT 'D') AS Custs;
empid A B C D
----------- ----------- ----------- ----------- -----------
1 NULL 20 34 NULL
2 52 27 NULL NULL
3 20 NULL 22 30
empid A B C D custid
----------- ----------- ----------- ----------- ----------- ------
1 NULL 20 34 NULL A
1 NULL 20 34 NULL B
1 NULL 20 34 NULL C
1 NULL 20 34 NULL D
2 52 27 NULL NULL A
2 52 27 NULL NULL B
2 52 27 NULL NULL C
2 52 27 NULL NULL D
3 20 NULL 22 30 A
3 20 NULL 22 30 B
3 20 NULL 22 30 C
3 20 NULL 22 30 D
第二步:提取數據 第一步中的表只是為了方便展示第二部的CASE用的 SELECT empid, custid,
CASE custid
WHEN 'A' THEN A
WHEN 'B' THEN B
WHEN 'C' THEN C
WHEN 'D' THEN D
END AS qty
FROM dbo.EmpCustOrders
CROSS JOIN (VALUES('A'),('B'),('C'),('D')) AS Custs(custid);
empid custid qty
----------- --------- -----------
1 A NULL
1 B 20
1 C 34
1 D NULL
2 A 52
2 B 27
2 C NULL
2 D NULL
3 A 20
3 B NULL
3 C 22
3 D 30
第三步,用IS NOT NULL來清除NULL行 SELECT *
FROM (SELECT empid, custid,
CASE custid
WHEN 'A' THEN A
WHEN 'B' THEN B
WHEN 'C' THEN C
WHEN 'D' THEN D
END AS qty
FROM dbo.EmpCustOrders
CROSS JOIN (VALUES('A'),('B'),('C'),('D')) AS Custs(custid)) AS D
WHERE qty IS NOT NULL;
注意PIVOT 和UNPIVOT不是逆反的過程,因為已經聚合過了。
比如說(1 C 34)這行,其中的34就是由元數據表中的
1, 'C', 20
1, 'C', 14
聚合而成。
轉載于:https://www.cnblogs.com/lwzz/archive/2011/01/29/1947567.html
總結
以上是生活随笔為你收集整理的UNPIVOT的详细说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Documentum常见问题2—压力测试
- 下一篇: 换个角度看敏捷1-敏捷问题解决方式