【发布时间】: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 执行标准数据透视,但我不能同时让 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运算符灵活得多。 Cross Tabs and Pivots, Part 1 – Converting Rows to Columns