【问题标题】:How can I pivot multiple value columns at once?如何一次旋转多个值列?
【发布时间】:2019-10-15 13:05:07
【问题描述】:

我在 SQL Server 中有一个如下所示的表:

|实体 ID |属性名 |价值来源 |值文本 | |------------|---------------|-------------|-------- --------| | 1 |姓名 |客户 |约翰·史密斯 | | 1 |年龄 |客户 | 25 | | 1 |地址 |查找 |主街 123 号 | | 2 |姓名 |客户 |简·多伊 | | 2 |年龄 |客户 | 30 | | 2 |地址 |客户 | 1 示例路 |

也就是说,除了有标准的 EAV 列之外,它还有一个关于值的元数据列。

我的目标是将表格转换为以下几行的关系格式:

|实体 ID |姓名 |名称来源 |年龄 |年龄来源 |地址 |地址来源 | |---------|------------|------------|-----|------ -----|----------------|----------------| | 1 |约翰·史密斯 |客户 | 25 |客户 |主街 123 号 |查找 | | 2 |简多 |客户 | 30 |客户 | 1 示例路 |客户 |

但是,我对 T-SQL 数据透视很陌生,虽然我可以忽略 ValueSource 执行标准数据透视,但我不能同时让 ValueSourceValueText 透视到结果表中。我希望

SELECT EntityId, val.Name, val.Age, val.Address, src.Name AS NameSource, src.Age AS AgeSource, src.Address AS AddressSource
FROM #PivotExample
PIVOT (MAX (ValueText) FOR AttributeName IN (Name, Age, Address)) AS val
PIVOT (MAX (ValueSource) FOR AttributeName IN (Name, Age, Address)) AS src;

但这只是告诉我AttributeName 是第二个枢轴上的无效列名,我不知道从那里去哪里。

【问题讨论】:

标签: tsql pivot


【解决方案1】:

这是 PIVOT 选项的工作示例

示例(or dbFiddle)

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

示例

【讨论】:

    【解决方案2】:

    正如 cmets 中所建议的,交叉表查询提供了一种更灵活的透视方式:

    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;
    

    【讨论】:

      猜你喜欢
      • 2022-01-21
      • 2020-11-15
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      • 2021-01-21
      • 2022-06-14
      相关资源
      最近更新 更多