行列转换
行列转换,在SQL Server中属于常见的基本操作。无论是搭建数仓,还是通过PowerBI进行数据分析,我们总会接触到各式各样的数据源,而在这些数据源中,除了标准的大型数仓外,我们很少能够拿到标准规范的数据表结构。
接触最多的,往往是大宽表,这就需要我们将大宽表转换为标准的二维表结构,即实现表结构的降维操作,也就是PowerBI中的透视功能。
函数介绍
PIVOT语法:
PIVOT (
< 聚合函数 >(要聚合的列) FOR < 转换的列 > IN (转换的列的值列表)
) AS 转换后的表名
UNPIVOT语法:
UNPIVOT (
< 聚合函数 >(要聚合的列) FOR < 转换的列 > IN (转换的列的值列表)
) AS 转换后的表名
PIVOT函数,通常用来将表结构从二维表转换为大宽表,而UNPIVOT则恰恰相反,通常是用来将大宽表转换为二维表。
使用实例
案例数据:
在白茶的本机数据库中,存在名为CaseData的数据库,存在名为“Test1”的二维表和名为“Test2”大宽表。
例子1:
将二维表,转换为大宽表。
SELECT
*
FROM
Test1 PIVOT (
SUM(Sales) FOR Product IN (女装, 男装, 童装, 鞋子, 裤子)
) AS NewTable
结果如下:
当然,除了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
日期
结果如下:
例子2:
将大宽表,转换为二维表。
SELECT
*
FROM
Test2 UNPIVOT (
Sales FOR Product IN (女装, 男装, 童装, 鞋子, 裤子)
) AS NewTable
结果如下:
同理,除了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
结果如下: