首页 > 解决方案 > 如何一次旋转多个值列?

问题描述

我在 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是第二个枢轴上的无效列名,我不确定从那里去哪里。

标签: tsqlpivot

解决方案


这是 PIVOT 选项的工作示例

示例(或 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

例子

在此处输入图像描述


推荐阅读