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

Моя таблица, как показано ниже

КолА полковник Б КолК Холодный КолЭ КолФ АВСD ЭФГХ ХИДК Р111 ХИДК 20 АВСD ЭФГХ ХХХХ Р111 ХХХХ 30 АВСD ЭФГХ ХХХХ Р112 ГГГГ 40 АВСD ЭФГХ зззз Р112 зззз 50

Вывод того, что я хочу, это

КолА полковник Б КолК Р111 Р112 АВСD ЭФГХ ХИДК 20 АВСD ЭФГХ ХХХХ 30 40 АВСD ЭФГХ зззз 50

Я пробовал использовать SQL PIVOT, но постоянно получаю сообщение о недопустимом параметре.

По сути, ColD, ColE и ColF — это то, что я хочу транспонировать, где ColE и ColC одинаковы. Может ли кто-нибудь помочь?

«Я пробовал использовать SQL PIVOT, но постоянно получаю ошибку «Недопустимый параметр». вы забыли включить эту попытку и полную ошибку. Хотя, честно говоря, забудьте, что PIVOT существует; используйте условную агрегацию.

Thom A 20.06.2024 16:25

Имя «Sql_query» не является допустимым идентификатором. Я не могу разместить здесь фактический запрос/ошибку. К сожалению, ограничения копирования и вставки. Как ни странно, динамический запрос не запускается, когда я пытаюсь exec @sql, но если я скопирую и вставлю запрос, созданный в переменной «sql», он сработает. Так что я сейчас действительно в замешательстве. Для условной агрегации агрегировать нечего. Это скорее транспонирование, при котором ColD может иметь динамическое количество различных значений, и их необходимо преобразовать в динамические столбцы.

Mayur Ghanekar 20.06.2024 17:18

Я хочу транспонировать, где ColE и ColC одинаковы... Я не понимаю вторую строку в желаемом выводе. Почему в списке 40? В исходных данных ColE <> ColC для 40. Один — XXXX, другой — YYYY.

Isolated 20.06.2024 18:20

@Isolated Потому что я хочу транспонировать столбец D и показать его отдельное содержимое как мои динамические столбцы

Mayur Ghanekar 20.06.2024 18:23

Но colC <> colE; следовательно, это нарушает ваши требования, не так ли?

Isolated 20.06.2024 18:28

ох, извините, ColC точно такой же, как ColE. там опечатка.

Mayur Ghanekar 20.06.2024 18:47

Используйте функцию редактирования, чтобы продемонстрировать свои попытки. Комментарии им не место.

Thom A 20.06.2024 19:04

Если ColE не имеет значения, то просто удалите из вопроса. Если ColE имеет значение, вам следует добавить примеры данных и желаемый результат, показывающий, насколько это важно.

Isolated 20.06.2024 19:34
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
9
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Это довольно стандартный поворот. Проблема в том, что вы хотите игнорировать ColE, что проще всего сделать, удалив его внутри подзапроса, например:

select *
into #data
from (
    VALUES  (N'ABCD', N'EFGH', N'HIJK', N'R111', N'HIJK', 20)
    ,   (N'ABCD', N'EFGH', N'XXXX', N'R111', N'XXXX', 30)
    ,   (N'ABCD', N'EFGH', N'XXXX', N'R112', N'YYYY', 40)
    ,   (N'ABCD', N'EFGH', N'zzzz', N'R112', N'zzzz', 50)
) t (ColA,ColB,ColC,ColD,ColE,ColF)

select *
FROM    (
    select ColA, ColB, ColC, ColD, ColF
    FROM    #data
    ) x
pivot (max(colf) for ColD IN ([R111], [R112])) pv

Как видите, я выбираю только ColA, ColB, ColC, ColD, ColF, что удаляет ненужные значения ColE.

Выход:

КолА полковник Б КолК Р111 Р112 АВСD ЭФГХ ХИДК 20 НУЛЕВОЙ АВСD ЭФГХ ХХХХ 30 40 АВСD ЭФГХ зззз НУЛЕВОЙ 50

Для динамического свода вам необходимо динамически генерировать часть [R111], [R112], что представляет собой простой запрос DISTINCT:

DECLARE @sql NVARCHAR(MAX)

SELECT  @SQL = N'

select *
FROM    (
    select ColA, ColB, ColC, ColD, ColF
    FROM    #data
    ) x
pivot (max(colf) for ColD IN (' + STRING_AGG(CAST(QUOTENAME(ColD) AS NVARCHAR(MAX)), N',') WITHIN GROUP(ORDER BY ColD) + ')) pv'
FROM (
    SELECT DISTINCT ColD
    FROM    #data
    ) x

EXEC(@SQL)

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