sql-server - 请解释一下 PIVOT 的组成部分

标签 sql-server tsql sql-server-2008 pivot

我读过很多博客文章。我已阅读文档。我通常相当善于学习新东西,但即使我继续阅读,但我就是不理解 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/

相关文章:

sql-server - SSIS 中 bool 值的问题

sql-server - TSQL 触发器而不是插入

c# - 我可以异步创建多个 DBConnections 吗?

sql-server - 如何在OPENQUERY中使用update和join

sql-server - "sounds-like", "did you mean THAT"在 SQL Server 2005 中使用全文搜索的功能

sql - 在多行上执行表值函数?

sql-server - T-SQL : What is NOT(1=NULL)?

tsql - smallint 与 int 的性能对比

sql - 如何获取列值不为零的平均值?

sql - 在SSMS中,如何找到包含星号,一些文本和另一个星号的字符串?