如何根据列值合并多行
How to combine multiple rows based on column value(s)
我才刚刚开始 SQL,所以一如既往,对这个有创意的问题深表歉意。我将 SQL 用于报告目的。我不是要写数据。我没有设置 up/nor 我可以修改我系统中的任何 table 吗?
上周末在谷歌搜索和测试时我似乎无法克服的问题是我有一个正常运行的查询,它为我提供了每个 GUID [tables 的 1 行数据 [Main_ID
].我需要从共享相同 [Main ID
] 并具有各种但不变的辅助 ID [Attribute_ID
] 的另一个 table 中提取一些数据。
要详细了解 table,Attribute_IDs
('Att_1'
、'Att_2'
、...)在整个系统中保持不变,而不管 Main_ID
。每个 Attribute_ID
总是与同一列相关('Att_1' = archar255
、'Att_2' = archarMAX
)。每个属性 ID 只有 1 列数据。最右边 3 列中的值是变化的字符串。
Table - Value_Table
+-----------+--------------+----------------+----------------+-------------+
| Main_ID | Attribute_ID | archar255 | archarMAX | LookupValue |
| GUID_ID_1 | Att_1 | | blah blah | |
| GUID_ID_1 | Att_2 | 255 value test | | |
| GUID_ID_1 | Att_3 | | | LV |
| GUID_ID_1 | Att_4 | | MAX | |
| GUID_ID_1 | Att_5 | | something else | |
+-----------+--------------+----------------+----------------+-------------+
预期输出 -
+-----------+-----------+----------------+-------+-------+
| Main_ID | Att_1 | Att_2 | Att_3 | Att_4 |
| GUID_ID_1 | blah blah | 255 value test | LV | MAX |
+-----------+-----------+----------------+-------+-------+
如果有人愿意帮助我,或者只是简单地指出正确的方向,我将不胜感激。
我试过使用 WHERE
语句和 CASE
但它只能指向实际存在的 5 行中的 1 行。
我猜你需要条件聚合:
SELECT
vt.Main_ID,
MAX( CASE WHEN vt.attribute_ID = 'Att_1' THEN vt.archarMAX END) Att1,
MAX( CASE WHEN vt.attribute_ID = 'Att_2' THEN vt.archar255 END) Att2,
MAX( CASE WHEN vt.attribute_ID = 'Att_3' THEN vt.LookupValue END) Att3,
MAX( CASE WHEN vt.attribute_ID = 'Att_4' THEN vt.archarMAX END) Att4
FROM Value_Table vt
GROUP BY vt.Main_ID;
这里是 a db fiddle 和您的示例数据(因为您没有标记 RDBMS,所以我选择了 MySQL,但这几乎可以在任何地方使用):
WITH Value_Table AS (
SELECT 'GUID_ID_1' Main_ID, 'Att_1' Attribute_ID, null archar255, 'blah blah' archarMAX, null LookupValue
UNION SELECT 'GUID_ID_1', 'Att_2', '255 value test', null, null
UNION SELECT 'GUID_ID_1', 'Att_3', null, null, 'LV'
UNION SELECT 'GUID_ID_1', 'Att_4', null, 'MAX', null
UNION SELECT 'GUID_ID_1', 'Att_5', null, 'something else', null
)
SELECT
vt.Main_ID,
MAX( CASE WHEN vt.attribute_ID = 'Att_1' THEN vt.archarMAX END) Att1,
MAX( CASE WHEN vt.attribute_ID = 'Att_2' THEN vt.archar255 END) Att2,
MAX( CASE WHEN vt.attribute_ID = 'Att_3' THEN vt.LookupValue END) Att3,
MAX( CASE WHEN vt.attribute_ID = 'Att_4' THEN vt.archarMAX END) Att4
FROM Value_Table vt
GROUP BY vt.Main_ID
Main_ID | Att1 | Att2 | Att3 | Att4
:-------- | :-------- | :------------- | :--- | :---
GUID_ID_1 | blah blah | 255 value test | LV | MAX
这里是枢轴:
select main_id, max([Att_1]) as Att_1, max([Att_2]) as Att_2, max([Att_3]) as Att_3, max([Att_4]) as Att_4
from
(
select main_id, Attribute_ID,
Attribute_ID+'1' As Attribute_ID1,
Attribute_ID+'2' As Attribute_ID2,
archar255, archarMax, Lookupvalue
from #yt
) as src
pivot
(
max(archarMax)
for Attribute_ID in ([Att_1], [Att_2], [Att_3], [Att_4])
) as piv
group by main_id
我才刚刚开始 SQL,所以一如既往,对这个有创意的问题深表歉意。我将 SQL 用于报告目的。我不是要写数据。我没有设置 up/nor 我可以修改我系统中的任何 table 吗?
上周末在谷歌搜索和测试时我似乎无法克服的问题是我有一个正常运行的查询,它为我提供了每个 GUID [tables 的 1 行数据 [Main_ID
].我需要从共享相同 [Main ID
] 并具有各种但不变的辅助 ID [Attribute_ID
] 的另一个 table 中提取一些数据。
要详细了解 table,Attribute_IDs
('Att_1'
、'Att_2'
、...)在整个系统中保持不变,而不管 Main_ID
。每个 Attribute_ID
总是与同一列相关('Att_1' = archar255
、'Att_2' = archarMAX
)。每个属性 ID 只有 1 列数据。最右边 3 列中的值是变化的字符串。
Table - Value_Table
+-----------+--------------+----------------+----------------+-------------+
| Main_ID | Attribute_ID | archar255 | archarMAX | LookupValue |
| GUID_ID_1 | Att_1 | | blah blah | |
| GUID_ID_1 | Att_2 | 255 value test | | |
| GUID_ID_1 | Att_3 | | | LV |
| GUID_ID_1 | Att_4 | | MAX | |
| GUID_ID_1 | Att_5 | | something else | |
+-----------+--------------+----------------+----------------+-------------+
预期输出 -
+-----------+-----------+----------------+-------+-------+
| Main_ID | Att_1 | Att_2 | Att_3 | Att_4 |
| GUID_ID_1 | blah blah | 255 value test | LV | MAX |
+-----------+-----------+----------------+-------+-------+
如果有人愿意帮助我,或者只是简单地指出正确的方向,我将不胜感激。
我试过使用 WHERE
语句和 CASE
但它只能指向实际存在的 5 行中的 1 行。
我猜你需要条件聚合:
SELECT
vt.Main_ID,
MAX( CASE WHEN vt.attribute_ID = 'Att_1' THEN vt.archarMAX END) Att1,
MAX( CASE WHEN vt.attribute_ID = 'Att_2' THEN vt.archar255 END) Att2,
MAX( CASE WHEN vt.attribute_ID = 'Att_3' THEN vt.LookupValue END) Att3,
MAX( CASE WHEN vt.attribute_ID = 'Att_4' THEN vt.archarMAX END) Att4
FROM Value_Table vt
GROUP BY vt.Main_ID;
这里是 a db fiddle 和您的示例数据(因为您没有标记 RDBMS,所以我选择了 MySQL,但这几乎可以在任何地方使用):
WITH Value_Table AS (
SELECT 'GUID_ID_1' Main_ID, 'Att_1' Attribute_ID, null archar255, 'blah blah' archarMAX, null LookupValue
UNION SELECT 'GUID_ID_1', 'Att_2', '255 value test', null, null
UNION SELECT 'GUID_ID_1', 'Att_3', null, null, 'LV'
UNION SELECT 'GUID_ID_1', 'Att_4', null, 'MAX', null
UNION SELECT 'GUID_ID_1', 'Att_5', null, 'something else', null
)
SELECT
vt.Main_ID,
MAX( CASE WHEN vt.attribute_ID = 'Att_1' THEN vt.archarMAX END) Att1,
MAX( CASE WHEN vt.attribute_ID = 'Att_2' THEN vt.archar255 END) Att2,
MAX( CASE WHEN vt.attribute_ID = 'Att_3' THEN vt.LookupValue END) Att3,
MAX( CASE WHEN vt.attribute_ID = 'Att_4' THEN vt.archarMAX END) Att4
FROM Value_Table vt
GROUP BY vt.Main_ID
Main_ID | Att1 | Att2 | Att3 | Att4
:-------- | :-------- | :------------- | :--- | :---
GUID_ID_1 | blah blah | 255 value test | LV | MAX
这里是枢轴:
select main_id, max([Att_1]) as Att_1, max([Att_2]) as Att_2, max([Att_3]) as Att_3, max([Att_4]) as Att_4
from
(
select main_id, Attribute_ID,
Attribute_ID+'1' As Attribute_ID1,
Attribute_ID+'2' As Attribute_ID2,
archar255, archarMax, Lookupvalue
from #yt
) as src
pivot
(
max(archarMax)
for Attribute_ID in ([Att_1], [Att_2], [Att_3], [Att_4])
) as piv
group by main_id