zoukankan      html  css  js  c++  java
  • 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
    聚合而成。
  • 相关阅读:
    poj 1321 棋盘问题 (DFS深度优先搜索)
    HDOJ1312 Red and black(DFS深度优先搜索)
    《数据结构》例1.3
    hdoj1905 Pseudoprime numbers (基础数论)
    百练4003 十六进制转十进制(水题)
    第二天——2.23
    第一天——2.22
    返校——2.21
    被盗号了——2.19
    继续咸鱼——2.18
  • 原文地址:https://www.cnblogs.com/lwzz/p/1947567.html
Copyright © 2011-2022 走看看