PIVOT несколько строк в другой столбец с дополнительным столбцом

Мне нужно ваше предложение по этому поводу.

У меня есть таблица до, как показано ниже, которую я хотел бы преобразовать в таблицу после,

(примечание: приведенная ниже таблица является лишь примером, в реальной таблице более 1000 строк)

До:

line_type имя_линии op_id орг_код Внутренний Хранилище 1 1 азбука Маклун Хранилище 2 1 ДЭФ Процесс Хранилище 2 1 XYZ Внутренний Хранилище 3 2 XYZ Маклун Хранилище 1 2 азбука Процесс Хранилище 2 2 XYZ

После:

op_id org_code внутренний Внутренний org_code Маклун Маклун org_code Процесс Процесс 1 азбука Хранилище 1 ДЭФ Хранилище 2 XYZ Хранилище 2 2 XYZ Хранилище 3 азбука Хранилище 1 XYZ Хранилище 2

Могу ли я использовать PIVOT для этого случая? Или мне нужно использовать другой способ?

Мне удалось использовать PIVOT только для line_name, я не знаю, как PIVOT их обоих (line_name и org_code)

Вот что я пробовал:

SELECT 
    [op_id], 
    [Internal],
    [Makloon],
    [Process]
FROM
    (SELECT
         [line_type],
         [line_name],
         [op_id]
     FROM 
         [database_name]
    ) pvt
PIVOT 
    (MAX(line_name)
        FOR [line_type] IN ([Internal], [Makloon], [Process])
    ) AS pvt_table
ORDER BY 
    [op_id];

Результат этого запроса:

op_id Внутренний Маклун Процесс 1 Хранилище 1 Хранилище 2 Хранилище 2 2 Хранилище 3 Хранилище 1 Хранилище 2
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
0
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Pivot — это просто причудливое выражение CASE WHEN, и часто проще написать его вручную:

SELECT op_id
,   MAX(case when line_type = 'Internal' THEN org_code END) AS org_code_internal
,   MAX(case when line_type = 'Internal' THEN line_name END) AS internal
,   MAX(case when line_type = 'Makloon' THEN org_code END) AS org_code_Makloon
,   MAX(case when line_type = 'Makloon' THEN line_name END) AS internal_Makloon
,   MAX(case when line_type = 'Process' THEN org_code END) AS org_code_Process
,   MAX(case when line_type = 'Process' THEN line_name END) AS Process

FROM (
    VALUES  (N'Internal', N'Storage 1', 1, N'ABC')
    ,   (N'Makloon', N'Storage 2', 1, N'DEF')
    ,   (N'Process', N'Storage 2', 1, N'XYZ')
    ,   (N'Internal', N'Storage 3', 2, N'XYZ')
    ,   (N'Makloon', N'Storage 1', 2, N'ABC')
    ,   (N'Process', N'Storage 2', 2, N'XYZ')
) t (line_type,line_name,op_id,org_code)
group by op_id

С помощью этого метода вы можете переворачивать практически любые строки.

Спасибо, я попробовал, и это сработало так, как я ожидал

lolster 02.02.2023 20:06

@lolster Когда вы найдете ответ, который работает, ПРИМИТЕ его. Это служит двум целям: 1) поблагодарить автора за время и талант, и 2) указать другим участникам, что проблема решена.

John Cappelletti 02.02.2023 21:53

Другие вопросы по теме