问题描述
我们可以通过使用PIVOT或以下方法获得所需的下表吗?我正在尝试将下表转换为所需的输出,如下所示。
数据集:
question_id element_id
1 john
1 bran
1 o_siera
2 brook
2 joseph
2 o_daniel
2 o_cody
3 derick
3 james
3 sophia
3 o_sandra
3 o_ashley
所需结果:
我们可以这样实现吗
question_id element_id element
1 john o_siera
1 bran
2 brook o_daniel,o_cody
2 joseph
3 derick o_sandra,o_ashley
3 james
3 sophia
解决方法
根据您提供的示例数据,无法知道哪个ELEMENT_ID旁边应该有ELEMENT列表。
您可以使用下面的查询,该查询将每个QUESTION_ID的ELEMENT列表按字母顺序放在第一个ELEMENT_ID旁边。
示例
WITH
t (question_id,element_id)
AS
(SELECT 1,'john' FROM DUAL
UNION ALL
SELECT 1,'bran' FROM DUAL
UNION ALL
SELECT 1,'o_siera' FROM DUAL
UNION ALL
SELECT 2,'brook' FROM DUAL
UNION ALL
SELECT 2,'joseph' FROM DUAL
UNION ALL
SELECT 2,'o_daniel' FROM DUAL
UNION ALL
SELECT 2,'o_cody' FROM DUAL
UNION ALL
SELECT 3,'derick' FROM DUAL
UNION ALL
SELECT 3,'james' FROM DUAL
UNION ALL
SELECT 3,'sophia' FROM DUAL
UNION ALL
SELECT 3,'o_sandra' FROM DUAL
UNION ALL
SELECT 3,'o_ashley' FROM DUAL)
SELECT question_id,element_id,CASE
WHEN ROW_NUMBER () OVER (PARTITION BY question_id ORDER BY element_id) = 1
THEN
(SELECT LISTAGG (t2.element_id,',')
FROM t t2
WHERE element_id LIKE 'o\_%' ESCAPE '\' AND t2.question_id = t1.question_id)
ELSE
NULL
END AS element
FROM t t1
WHERE element_id NOT LIKE 'o\_%' ESCAPE '\'
order by question_id,element_id;
结果
QUESTION_ID ELEMENT_ID ELEMENT
______________ _____________ _____________________
1 bran o_siera
1 john
2 brook o_cody,o_daniel
2 joseph
3 derick o_ashley,o_sandra
3 james
3 sophia
,
这可能会帮助
select *
(Select listagg(element_id,') within group (order by element_id) from tbl ti
where ti.question_id = t.question_id
and element_id like 'o%'
) element
from tbl t
where element_id not like 'o_%',