alt

行列转换

行列转换,在SQL Server中属于常见的基本操作。无论是搭建数仓,还是通过PowerBI进行数据分析,我们总会接触到各式各样的数据源,而在这些数据源中,除了标准的大型数仓外,我们很少能够拿到标准规范的数据表结构。 接触最多的,往往是大宽表,这就需要我们将大宽表转换为标准的二维表结构,即实现表结构的降维操作,也就是PowerBI中的***。

函数介绍

PIVOT语法:

PIVOT (
  < 聚合函数 >(要聚合的列) FOR < 转换的列 > IN (转换的列的值列表)
) AS 转换后的表名

UNPIVOT语法:

UNPIVOT (
  < 聚合函数 >(要聚合的列) FOR < 转换的列 > IN (转换的列的值列表)
) AS 转换后的表名

PIVOT函数,通常用来将表结构从二维表转换为大宽表,而UNPIVOT则恰恰相反,通常是用来将大宽表转换为二维表。

使用实例

案例数据:

alt

alt

在白茶的本机数据库中,存在名为CaseData的数据库,存在名为“Test1”的二维表和名为“Test2”大宽表。

例子1:

将二维表,转换为大宽表。

SELECT
    *
FROM
    Test1 PIVOT (
        SUM(Sales) FOR Product IN (女装, 男装, 童装, 鞋子, 裤子)
    ) AS NewTable

结果如下:

alt

当然,除了PIVOT函数以外,我们还可以使用常规的计算方法。

SELECT
    日期,
    SUM(
        CASE
            WHEN Product = N'女装' THEN Sales
            ELSE 0
        END
    ) AS '女装',
    SUM(
        CASE
            WHEN Product = N'男装' THEN Sales
            ELSE 0
        END
    ) AS '男装',
    SUM(
        CASE
            WHEN Product = N'童装' THEN Sales
            ELSE 0
        END
    ) AS '童装',
    SUM(
        CASE
            WHEN Product = N'鞋子' THEN Sales
            ELSE 0
        END
    ) AS '鞋子',
    SUM(
        CASE
            WHEN Product = N'裤子' THEN Sales
            ELSE 0
        END
    ) AS '裤子'
FROM
    Test1
GROUP BY
    日期

结果如下:

alt

例子2:

将大宽表,转换为二维表。

SELECT
    *
FROM
    Test2 UNPIVOT (
        Sales FOR Product IN (女装, 男装, 童装, 鞋子, 裤子)
    ) AS NewTable

结果如下:

alt

同理,除了UNPIVOT函数以外,列转行也是有其他办法的。

SELECT
    日期,
    N'女装' AS "Product",
    女装 AS Sales
FROM
    Test2
UNION
SELECT
    日期,
    N'男装' AS "Product",
    男装 AS Sales
FROM
    Test2
UNION
SELECT
    日期,
    N'童装' AS "Product",
    童装 AS Sales
FROM
    Test2
UNION
SELECT
    日期,
    N'鞋子' AS "Product",
    鞋子 AS Sales
FROM
    Test2
UNION
SELECT
    日期,
    N'裤子' AS "Product",
    裤子 AS Sales
FROM
    Test2

结果如下:

alt

alt alt

这里是白茶,一个PowerBI的初学者。 alt