sql pivot
什么是.sql pivot?
.sql pivot是一种SQL数据转换技术,用于将长的表格(包含多个列)转换为宽的表格(只有一个值列)。在数据仓库、商业智能和大数据分析等地方,pivot操作非常常见。
.sql pivot的语法
.sql pivot的语法如下:
SELECT 非聚合列, [pivot列1], [pivot列2], … [value列]
FROM 数据源表名
PIVOT
(
AGG(value列) FOR [pivot列] IN ([pivot列值1], [pivot列值2], … [pivot列值n])
) AS [别名]
其中,非聚合列是结果中需要显示的列,pivot列是需要进行列转行的列,value列是需要进行聚合的列,[pivot列值1]等是列转行后的列名。
示例使用
我们通过一个示例来说明如何使用.sql pivot将长表格转换为宽表格:
假设我们有一个订单明细表格:
OrderID | Product | Quantity | Price |
---|---|---|---|
1 | Apple | 2 | 1.5 |
1 | Banana | 3 | 2.0 |
2 | Orange | 4 | 1.0 |
2 | Apple | 1 | 1.5 |
我们想要将其转换为以下形式:
OrderID | Apple | Banana | Orange |
---|---|---|---|
1 | 3 | 2 | 0 |
2 | 1 | 0 | 4 |
我们可以使用以下SQL语句实现:
SELECT OrderID, [Apple], [Banana], [Orange]
FROM (SELECT OrderID, Product, Quantity FROM OrderDetail) AS ODT
PIVOT(SUM(Quantity) FOR Product IN ([Apple], [Banana], [Orange])) AS PVT
其中,非聚合列是OrderID,pivot列是Product,value列是Quantity。
优势和劣势
使用.sql pivot的优势如下:
- 可以让数据变得更易读、更容易分析。
- 使用熟悉的SQL语句,语法简单。
但.sql pivot也有劣势:
- 可能导致性能问题。
- 仅适用于需要将列转换为行的场景。
- 某些数据库不支持此操作。
.sql pivot和.unpivot的区别
.sql pivot和.unpivot是两种互补的操作,.unpivot是否定pivot操作。
.unpivot的作用是将列转换为行,而不是行转换为列。例如,我们可以将上面的宽表格转换为长表格:
OrderID | Product | Quantity |
---|---|---|
1 | Apple | 3 |
1 | Banana | 2 |
1 | Orange | 0 |
2 | Apple | 1 |
2 | Banana | 0 |
2 | Orange | 4 |
我们可以使用以下SQL语句实现:
SELECT OrderID, Product, Quantity
FROM (SELECT [1], [2], [3], [4], [5], [6] FROM (SELECT * FROM WideTable) AS WT
UNPIVOT(Quantity FOR Product IN ([Apple], [Banana], [Orange])) AS UPT
WHERE Quantity != 0;
.unpivot的优势和劣势与.sql pivot类似。