我只是从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行。
答案 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