Отдельные столбцы для каждой переменной

Я сталкиваюсь с проблемой, когда я должен извлечь все возможные местоположения для продукта и организовать их в столбце. На нашем складе продукт может занимать несколько мест, и когда я извлекаю данные, они организованы следующим образом:

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
Другие вопросы по тегам