我读过很多博客文章。我已阅读文档。我通常相当善于学习新东西,但即使我继续阅读,但我就是不理解 SQL Server (2008) 中的 PIVOT 部分。
有人可以给我吗,很好,很慢。 (即《Pivot for Dummies》)
如果需要示例,我们可以使用 in this question .
以下是我尝试转变该示例的方法:
SELECT OtherID, Val1, Val2, Val3, Val4, Val5
FROM
(SELECT OtherID, Val
FROM @randomTable) p
PIVOT
(
max(val)
FOR Val IN (Val1, Val2, Val3, Val4, Val5)
) AS PivotTable;
上面的查询给我的是空值,而不是 Val1、Val2... 列中的值。
但需要明确的是,我并不是在此处寻找固定查询。我需要理解 PIVOT,因为我正在寻找比这个示例复杂得多的东西。
具体来说,聚合是怎么回事?我只想获取与给定 ID 匹配的所有字符串值并将它们放在同一行中。我并不想聚合任何东西。 (再次,请参阅 this question 作为我的示例。)
最佳答案
数据透视查询的说明
FROM
(SELECT OtherID, Val, amount
FROM @randomTable) p
这些列成为数据透视表的“基础数据”。不要包含不执行任何操作的列。正如您不会将非 GROUP BY 列放入 SELECT 子句中一样,您也不会列出 PIVOT 源中未使用的列。
PIVOT
(
max(amount)
FOR Val IN (Val1, Val2, Val3, Val4, Val5)
) AS PivotTable;
这部分表示您正在创建 5 个名为“Val1”到“Val5”的新列。这些列名称代表 Val 列中的值。所以预计你的表将包含这样的内容
otherID Val amount
1 Val1 1
2 Val2 2
1 Val3 3
1 Val1 5
(etc) (this column contains one of Val1 - Val5, or null)
现在您有了 5 个以前不存在的新列。该列中包含什么内容?
- 出现在输出中的任何非数据透视列的列都是“GROUP BY”列。
- 聚合函数将所有数据收集到 GROUP BY 列和 PIVOTED 列之间的交叉单元格中。
因此,为了说明这一点,使用上面的示例数据,我们有 otherID=1 和 val=Val1。在输出表中,只有一个单元格代表每个(otherID/val)组合的 Max(amount) 组合
otherID Val1 Val2 Val3 Val4 Val5
1 <x> ... ... ... ...
(etc)
对于标记为 <x>
的单元格,只允许有一个值,所以 <x>
不能包含多个 amount
值(value)观。这就是我们需要聚合它的原因,在本例中使用 MAX(amount)
。所以事实上,输出看起来像这样
(unpivoted columns) (pivoted, creates "new" columns)
otherID | Val1 Val2 Val3 Val4 Val5
1 | MAX(amount) Max(amount) << cell value = aggregate function
(etc)
SELECT 语句随后输出这些列
SELECT OtherID, Val1, Val2, Val3, Val4, Val5
关于sql-server - 请解释一下 PIVOT 的组成部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5443505/