Мне нужно ваше предложение по этому поводу.
У меня есть таблица до, как показано ниже, которую я хотел бы преобразовать в таблицу после,
(примечание: приведенная ниже таблица является лишь примером, в реальной таблице более 1000 строк)
До:
После:
Могу ли я использовать 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];
Результат этого запроса:
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 Когда вы найдете ответ, который работает, ПРИМИТЕ его. Это служит двум целям: 1) поблагодарить автора за время и талант, и 2) указать другим участникам, что проблема решена.
Спасибо, я попробовал, и это сработало так, как я ожидал