Tsql 如何一次透视多个值列?

Tsql 如何一次透视多个值列?,tsql,pivot,Tsql,Pivot,我在SQL Server中有一个如下所示的表: | EntityId | AttributeName | ValueSource | ValueText | |----------|---------------|-------------|----------------| | 1 | Name | Customer | John Smith | | 1 | Age | Customer | 25

我在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 |
但这只是告诉我,
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