如何使用 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
我有一个名为 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