Отдельные столбцы для каждой переменной
Я сталкиваюсь с проблемой, когда я должен извлечь все возможные местоположения для продукта и организовать их в столбце. На нашем складе продукт может занимать несколько мест, и когда я извлекаю данные, они организованы следующим образом:
SKID LOCATION
---- --------
A S1
A S2
A S3
B S4
B S5
C S6
Я хотел бы организовать это так, чтобы местоположения были организованы в отдельные столбцы.
SKID LOCATION1 LOCATION2 LOCATION3
---- --------- --------- ---------
A S1 S2 S3
B S4 S5 -
C S6 - -
Как это можно сделать, если это вообще можно сделать?
2 ответа
Предполагая, что вы знаете максимальное количество столбцов, которое вы хотите в наборе результатов, вы можете сделать это с помощью условного агрегирования или pivot
:
select skid,
max(case when seqnum = 1 then location end) as location_1,
max(case when seqnum = 2 then location end) as location_2,
max(case when seqnum = 3 then location end) as location_3
from (select t.*, row_number() over (partition by skid order by location) as seqnum
from t
) t
group by skid;
Если вы не знаете максимум, то динамический SQL (execute immediate
), listagg()
Вложенные таблицы или JSON являются некоторыми альтернативами.
Это приблизит вас -
SELECT
SKID,
LISTAGG(LOCATION,',') WITHIN GROUP(
ORDER BY
SKID,LOCATION
) as location
FROM
(
SELECT
'A' AS SKID,
'S1' AS LOCATION
FROM
DUAL
UNION
SELECT
'A' AS SKID,
'S2' AS LOCATION
FROM
DUAL
UNION
SELECT
'A' AS SKID,
'S3' AS LOCATION
FROM
DUAL
UNION
SELECT
'B' AS SKID,
'S4' AS LOCATION
FROM
DUAL
UNION
SELECT
'B' AS SKID,
'S5' AS LOCATION
FROM
DUAL
UNION
SELECT
'C' AS SKID,
'S6' AS LOCATION
FROM
DUAL
)
GROUP BY
SKID;
Выход -
SKID,LOCATION
A,S1,S2,S3
B,S4,S5
C,S6