Oracle sql 透视值以逗号分隔

时间:2021-04-09 08:09:55

标签: sql oracle pivot

我有以下输入

<头>
ID LOTYP PROID LOCKR
XXXXX 06 01
XXXXX 06 02 X
XXXXX 06 02 S
XXXXX 06 01 R
XXXXX 02 01
XXXXX 02 02 X
XXXXX 02 02 S
XXXXX 02 01 R
YYYY 06 01
YYYY 06 02 X
YYYY 06 02 S
YYYY 06 01 R
YYYY 02 01
YYYY 02 02 X
YYYY 02 02 S
YYYY 02 01 R

我想要下面的输出

<头>
ID 0201 0202 0601 0602
XXXXX R, Y S, X R, Y S, X
YYYY R, Y S, X R, Y S, X

我可以分别旋转和 listagg,但我正在努力将它们组合起来以产生所需的输出。

2 个答案:

答案 0 :(得分:2)

您可以对 id 和串联 (lotyp||proid) 列的分组结果进行透视,例如

SELECT *
  FROM
  (
    SELECT id,lotyp||proid As title,
           LISTAGG(lockr,',') WITHIN GROUP (ORDER BY lotyp||proid) AS value
      FROM t
     GROUP BY id,lotyp||proid )
 PIVOT (
         MAX(value) FOR title IN ('0201' AS "0201",
                                  '0202' AS "0202",
                                  '0601' AS "0601",
                                  '0602' AS "0602"))   
 ORDER BY id;
<头>
ID 0201 0202 0601 0602
XXXXX R,Y S,X R,Y S,X
YYYY R,Y S,X R,Y S,X

Demo

答案 1 :(得分:1)

我发现条件聚合比 pivot 简单得多:

SELECT id,
       LISTAGG(CASE WHEN lotyp = '02' AND proid = '01' THEN lockr END, ',') WITHIN GROUP (ORDER BY lockr) as "0201",
       LISTAGG(CASE WHEN lotyp = '02' AND proid = '02' THEN lockr END, ',') WITHIN GROUP (ORDER BY lockr) as "0201",
       LISTAGG(CASE WHEN lotyp = '06' AND proid = '01' THEN lockr END, ',') WITHIN GROUP (ORDER BY lockr) as "0601",
       LISTAGG(CASE WHEN lotyp = '02' AND proid = '01' THEN lockr END, ',') WITHIN GROUP (ORDER BY lockr) as "0601"
FROM t
GROUP BY id ;

没有子查询。只是逻辑清楚地做你想做的事情。

相关问题