我正在尝试移动一些行并将它们转换为列
I'm trying to move some rows and convert them as columns
我们能否通过使用 PIVOT 或其他方式获得以下所需的 table。我正在尝试将 table 以下转换为所需的输出,如下所示。
数据集:
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
这可能有帮助
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_%',
根据您提供的示例数据,无法知道哪个 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
我们能否通过使用 PIVOT 或其他方式获得以下所需的 table。我正在尝试将 table 以下转换为所需的输出,如下所示。
数据集:
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
这可能有帮助
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_%',
根据您提供的示例数据,无法知道哪个 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