如何使用 PIVOT 将 EAV 模式转换为普通模式?

How can I convert an EAV schema to a normal schema using PIVOT?

我有一个名为 SourceTable 的 table,因为我有 4 个字段。 Properties_title 字段有 3 个值(AAA、BBB、CCC),但也可以有更多。根据它们中的每一个,NumericValue 字段和 Property_item_title 字段有一个 value.According 到下面的 table,如果 Properties_title 是 AAA 或 CCC 所以 Property_item_title 它有价值,如果 Properties_title 是 BBB,那么 NumericValue 它有价值。 现在我希望将其转换为每个 W_ID 只生成一行,例如 Result Table.

来源Table:

+--------+------------------+---------------+---------------------+
|  W_ID  | Properties_title | NumericValue  | Property_item_title |
+--------+------------------+---------------+---------------------+
| 102859 |     AAA          | null          |  Useless            |
| 102859 |     BBB          | 30000         |  null               |
| 102859 |     CCC          | null          |  Repair             |
| 92527  |     AAA          | null          |  Use                |
| 92527  |     BBB          | 3250          |  null               |
+--------+------------------+---------------+---------------------+

结果Table:

+-------+-----------+---------+---------+
|  W_id |   AAA     |  BBB    | CCC     |
+-------+-----------+---------+-------- +
|102859 |  Useless  | 30000   |  Repair |
|92527  |  Use      | 3250    |  null   |
|...    |    ...    | ...     |  ...    |
+-------+-----------+---------+---------+

the column names has to be dynamic

我的代码:

CREATE TABLE dbo.SourceTable (W_ID int NOT NULL,
                            Properties_title varchar(3) NOT NULL,
                            NumericValue int NULL,
                            Property_item_title varchar(100) NULL);

INSERT INTO dbo.SourceTable
VALUES (102859,'AAA',NULL,'Useless'),
       (102859,'BBB',30000,NULL),
       (102859,'CCC',NULL,'Repair'),
       (92527,'AAA',NULL,'Use'),
       (92527,'BBB',3250,NULL);

SELECT *
FROM dbo.SourceTable;

Here 是一个 db<>fiddle.

感谢您的帮助。

要在 固定 列列表上进行透视,您可以进行条件聚合:

select 
    w_id,
    max(case when properties_title = 'AAA' then property_item_title end) aaa,
    max(case when properties_title = 'BBB' then numeric_value end) bbb,
    max(case when properties_title = 'CCC' then property_item_title end) ccc
from sourcetable
group by w_id