Tsql 如何一次透视多个值列?
我在SQL Server中有一个如下所示的表: | EntityId | AttributeName | ValueSource | ValueText | |----------|---------------|-------------|----------------| | 1 | Name | Customer | John Smith | | 1 | Age | Customer | 25 | | 1 | Address | Lookup | 123 Main St | | 2 | Name | Customer | Jane Doe | | 2 | Age | Customer | 30 | | 2 | Address | Customer | 1 Example Road |Tsql 如何一次透视多个值列?,tsql,pivot,Tsql,Pivot,我在SQL Server中有一个如下所示的表: | EntityId | AttributeName | ValueSource | ValueText | |----------|---------------|-------------|----------------| | 1 | Name | Customer | John Smith | | 1 | Age | Customer | 25
但这只是告诉我,
AttributeName
在第二个轴上是一个无效的列名,我不确定从哪里开始。正如注释中所建议的,跨选项卡查询提供了一种更灵活的轴转方式:
SELECT EntityId
, MAX(IIF(AttributeName = 'Name', ValueText,NULL) AS Name
, MAX(IIF(AttributeName = 'Name', ValueSource,NULL) AS NameSource
, MAX(IIF(AttributeName = 'Age', ValueText,NULL) AS Age
, MAX(IIF(AttributeName = 'Age', ValueSource,NULL) AS AgeSource
, MAX(IIF(AttributeName = 'Address', ValueText,NULL) AS Address
, MAX(IIF(AttributeName = 'Address', ValueSource,NULL) AS AddressSource
FROM #PivotExample
GROUP BY EntityID;
如注释所示,跨选项卡查询提供了更灵活的数据透视方式:
SELECT EntityId
, MAX(IIF(AttributeName = 'Name', ValueText,NULL) AS Name
, MAX(IIF(AttributeName = 'Name', ValueSource,NULL) AS NameSource
, MAX(IIF(AttributeName = 'Age', ValueText,NULL) AS Age
, MAX(IIF(AttributeName = 'Age', ValueSource,NULL) AS AgeSource
, MAX(IIF(AttributeName = 'Address', ValueText,NULL) AS Address
, MAX(IIF(AttributeName = 'Address', ValueSource,NULL) AS AddressSource
FROM #PivotExample
GROUP BY EntityID;
下面是PIVOT选项的工作示例 示例 示例
以下是PIVOT选项的工作示例 示例 示例
使用交叉表代替。它们比内置的
PIVOT
操作符灵活得多。使用交叉标签代替。它们比内置的PIVOT
操作符灵活得多。
SELECT EntityId
, MAX(IIF(AttributeName = 'Name', ValueText,NULL) AS Name
, MAX(IIF(AttributeName = 'Name', ValueSource,NULL) AS NameSource
, MAX(IIF(AttributeName = 'Age', ValueText,NULL) AS Age
, MAX(IIF(AttributeName = 'Age', ValueSource,NULL) AS AgeSource
, MAX(IIF(AttributeName = 'Address', ValueText,NULL) AS Address
, MAX(IIF(AttributeName = 'Address', ValueSource,NULL) AS AddressSource
FROM #PivotExample
GROUP BY EntityID;
Select *
From (
Select A.EntityID
,B.*
From YourTable A
Cross Apply ( values (AttributeName,ValueText)
,(AttributeName+'Source',ValueSource)
) B(Item,Value)
) src
Pivot (max(Value) for Item in ( [Name],[NameSource],[Age],[AgeSource],[Address],[AddressSource] ) ) pvt