Vac*_*ano 14 t-sql sql-server pivot sql-server-2008
我看过很多博文.我已经阅读了文档.我通常相当擅长拾取新东西,但即使我继续阅读,但我只是不理解SQL Server(2008)中的PIVOT部分.
有人可以把它给我,好又慢.(即傻瓜的枢轴)
如果需要一个例子,那么我们可以使用这个问题中的一个.
以下是我尝试转动该示例的方法:
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;
Run Code Online (Sandbox Code Playgroud)
上面的查询给出了空值而不是Val1,Val2 ...列中的值.
但要明确的是,我不是在寻找一个固定的查询.我需要了解 PIVOT,因为我正在寻找比这个例子更复杂的东西.
具体来说,聚合的交易是什么?我只想获取与给定ID匹配的所有字符串值并将它们放在同一行中.我不想集合任何东西.(再次,请看我的例子中的这个问题.)
Ric*_*iwi 20
数据透视查询的说明
FROM
(SELECT OtherID, Val, amount
FROM @randomTable) p
Run Code Online (Sandbox Code Playgroud)
这些是成为数据透视表"基础数据"的列.不要包含不执行任何操作的列.正如您没有将非GROUP BY列放入SELECT子句中一样,您也不会在PIVOT源中列出未使用的列.
PIVOT
(
max(amount)
FOR Val IN (Val1, Val2, Val3, Val4, Val5)
) AS PivotTable;
Run Code Online (Sandbox Code Playgroud)
这部分表示您正在创建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)
Run Code Online (Sandbox Code Playgroud)
所以你现在有5个以前不存在的新列.什么进入专栏?
因此,为了说明,使用上面的示例数据,我们有otherID = 1和val = Val1.在输出表中,只有一个单元表示每个(otherID/val)组合的Max(amount)组合
otherID Val1 Val2 Val3 Val4 Val5
1 <x> ... ... ... ...
(etc)
Run Code Online (Sandbox Code Playgroud)
对于标记的单元格<x>
,只允许一个值,因此<x>
不能包含多个amount
值.这就是为什么我们需要聚合它,在这种情况下使用MAX(amount)
.事实上,输出看起来像这样
(unpivoted columns) (pivoted, creates "new" columns)
otherID | Val1 Val2 Val3 Val4 Val5
1 | MAX(amount) Max(amount) << cell value = aggregate function
(etc)
Run Code Online (Sandbox Code Playgroud)
然后SELECT语句输出这些列
SELECT OtherID, Val1, Val2, Val3, Val4, Val5
Run Code Online (Sandbox Code Playgroud)