如何根据列值合并多行

时间:2019-01-15 00:52:54

标签: sql self-join

我只是从SQL开始,因此一如既往地为这个问题表示歉意。我将SQL用于报告目的。我不是要写数据。我没有设置/也不能修改系统中的任何表。

这个过去一个周末我在谷歌搜索和测试时似乎无法克服的问题是,我有一个功能正常的查询,该查询为每个GUID [{Main_ID]的不同表提供了1行数据。我需要从另一个共享相同[Main ID]并且具有各种但恒定的辅助ID [Attribute_ID]的表中提取一些数据。

要进一步了解表格,Attribute_IDs'Att_1''Att_2',...)在整个系统中都是恒定的,而与Main_ID无关。并且每个Attribute_ID始终与同一列('Att_1' = archar255'Att_2' = archarMAX)相关。每个属性ID只有1列数据。最右边3列中的值是可变的字符串。

表格-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行。

2 个答案:

答案 0 :(得分:2)

我想您需要条件聚合:

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 

答案 1 :(得分:0)

这里有支点:

    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