Oracle sql 以逗号分隔的旋转值
Oracle sql pivoting values separated by commas
我有以下输入
ID
LOTYP
PROID
LOCKR
XXXXX
06
01
Y
XXXXX
06
02
X
XXXXX
06
02
S
XXXXX
06
01
R
XXXXX
02
01
Y
XXXXX
02
02
X
XXXXX
02
02
S
XXXXX
02
01
R
YYYYY
06
01
Y
YYYYY
06
02
X
YYYYY
06
02
S
YYYYY
06
01
R
YYYYY
02
01
Y
YYYYY
02
02
X
YYYYY
02
02
S
YYYYY
02
01
R
我想要下面的输出
ID
0201
0202
0601
0602
XXXXX
R, Y
S, X
R, Y
S, X
YYYYY
R, Y
S, X
R, Y
S, X
我可以分别使用 pivot 和 listagg,但我很难将它们组合起来以产生所需的输出。
您可以对 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
YYYYY
R,Y
S,X
R,Y
S,X
我发现条件聚合比 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 ;
没有子查询。只是清楚地做你想做的事情的逻辑。
我有以下输入
ID | LOTYP | PROID | LOCKR |
---|---|---|---|
XXXXX | 06 | 01 | Y |
XXXXX | 06 | 02 | X |
XXXXX | 06 | 02 | S |
XXXXX | 06 | 01 | R |
XXXXX | 02 | 01 | Y |
XXXXX | 02 | 02 | X |
XXXXX | 02 | 02 | S |
XXXXX | 02 | 01 | R |
YYYYY | 06 | 01 | Y |
YYYYY | 06 | 02 | X |
YYYYY | 06 | 02 | S |
YYYYY | 06 | 01 | R |
YYYYY | 02 | 01 | Y |
YYYYY | 02 | 02 | X |
YYYYY | 02 | 02 | S |
YYYYY | 02 | 01 | R |
我想要下面的输出
ID | 0201 | 0202 | 0601 | 0602 |
---|---|---|---|---|
XXXXX | R, Y | S, X | R, Y | S, X |
YYYYY | R, Y | S, X | R, Y | S, X |
我可以分别使用 pivot 和 listagg,但我很难将它们组合起来以产生所需的输出。
您可以对 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 |
YYYYY | R,Y | S,X | R,Y | S,X |
我发现条件聚合比 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 ;
没有子查询。只是清楚地做你想做的事情的逻辑。