Моя таблица, как показано ниже
Вывод того, что я хочу, это
Я пробовал использовать SQL PIVOT, но постоянно получаю сообщение о недопустимом параметре.
По сути, ColD, ColE и ColF — это то, что я хочу транспонировать, где ColE и ColC одинаковы. Может ли кто-нибудь помочь?
Имя «Sql_query» не является допустимым идентификатором. Я не могу разместить здесь фактический запрос/ошибку. К сожалению, ограничения копирования и вставки. Как ни странно, динамический запрос не запускается, когда я пытаюсь exec @sql, но если я скопирую и вставлю запрос, созданный в переменной «sql», он сработает. Так что я сейчас действительно в замешательстве. Для условной агрегации агрегировать нечего. Это скорее транспонирование, при котором ColD может иметь динамическое количество различных значений, и их необходимо преобразовать в динамические столбцы.
Если вы не можете предоставить нам минимально воспроизводимый пример проблемы, мы не сможем вам помочь. Однако код, безусловно, можно вставить в Stack Overflow.
Я хочу транспонировать, где ColE и ColC одинаковы... Я не понимаю вторую строку в желаемом выводе. Почему в списке 40? В исходных данных ColE <> ColC для 40. Один — XXXX, другой — YYYY.
@Isolated Потому что я хочу транспонировать столбец D и показать его отдельное содержимое как мои динамические столбцы
Но colC <> colE; следовательно, это нарушает ваши требования, не так ли?
ох, извините, ColC точно такой же, как ColE. там опечатка.
Используйте функцию редактирования, чтобы продемонстрировать свои попытки. Комментарии им не место.
Если ColE не имеет значения, то просто удалите из вопроса. Если ColE имеет значение, вам следует добавить примеры данных и желаемый результат, показывающий, насколько это важно.
Это довольно стандартный поворот. Проблема в том, что вы хотите игнорировать 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.
Выход:
Для динамического свода вам необходимо динамически генерировать часть [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)
«Я пробовал использовать SQL PIVOT, но постоянно получаю ошибку «Недопустимый параметр». вы забыли включить эту попытку и полную ошибку. Хотя, честно говоря, забудьте, что
PIVOT
существует; используйте условную агрегацию.