tsql - 如何一次旋转多个值列?
问题描述
我在 SQL Server 中有一个如下所示的表:
| 实体 ID | 属性名 | 价值来源 | 值文本 | |------------|---------------|-------------|-------- --------| | 1 | 姓名 | 客户 | 约翰·史密斯 | | 1 | 年龄 | 客户 | 25 | | 1 | 地址 | 查找 | 主街 123 号 | | 2 | 姓名 | 客户 | 简·多伊 | | 2 | 年龄 | 客户 | 30 | | 2 | 地址 | 客户 | 1 示例路 |
也就是说,除了具有标准的 EAV 列之外,它还有一个关于值的元数据列。
我的目标是将表格转换为以下几行的关系格式:
| 实体 ID | 姓名 | 名称来源 | 年龄 | 年龄来源 | 地址 | 地址来源 | |---------|------------|------------|-----|------ -----|----------------|----------------| | 1 | 约翰·史密斯 | 客户 | 25 | 客户 | 主街 123 号 | 查找 | | 2 | 简多 | 客户 | 30 | 客户 | 1 示例路 | 客户 |
但是,我对 T-SQL 数据透视非常陌生,虽然我可以执行标准数据透视忽略ValueSource
,但我无法同时获得ValueSource
并ValueText
透视结果表。我希望
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
是第二个枢轴上的无效列名,我不确定从那里去哪里。
解决方案
这是 PIVOT 选项的工作示例
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
例子
推荐阅读
- python - 在模拟配置时使用 python 单元测试中的固定输入端到端测试 Airflow DAG
- jdbc - Kafka 连接器:如何使用 OR 运算符和递增列执行查询?
- javascript - 在基本 catch 块中处理 promise 拒绝
- php - PHP用负开始值计算时间
- php - 为 PHP 安装 gRPC 失败
- android - PDF.js 无法在 Android 11 上显示来自 externalFilesDir 的 PDF
- pdf - libreoffice 在带有表格边缘的命令行中将 xlsx 转换为 pdf
- python - 另一个“检查目标时出错:预期 dense_2 的形状为 (4,),但得到的数组的形状为 (1,)”
- react-native - 如何从 React-Native 中的 API 获取对象数据中的对象
- r - 按列中的计数拆分行