Оператор GROUP BY с командой PIVOT в T-SQL - PullRequest
0 голосов
/ 11 января 2019

У меня есть SQL-запрос, который включает команду PIVOT, которая создает правильную таблицу, но теперь мне нужно GROUP BY одного из столбцов.

Когда я пытаюсь добавить оператор GROUP BY, он возвращает следующую ошибку: «Столбец« PivotTable.1 »недопустим в списке выбора, поскольку он не содержится ни в статистической функции, ни в предложении GROUP BY».

SELECT [Load ID],[1],[2],[3],[4]
FROM TMS_Load_Stops
PIVOT (
    MIN([Stop Zip])
    for [Sequence] IN ([1],[2],[3],[4])
    ) PivotTable
;

Исходный код дает следующие результаты: enter image description here

И я хотел бы, чтобы результаты были следующими (значения являются случайными числами для целей объяснения): enter image description here

Ответы [ 3 ]

0 голосов
/ 11 января 2019

Использовать условную агрегацию. Это намного проще:

SELECT [Load ID],
       MIN(CASE WHEN [Sequence] = 1 THEN [Stop Zip] END) as [1],
       MIN(CASE WHEN [Sequence] = 2 THEN [Stop Zip] END) as [2],
       MIN(CASE WHEN [Sequence] = 3 THEN [Stop Zip] END) as [3],
       MIN(CASE WHEN [Sequence] = 4 THEN [Stop Zip] END) as [4],
FROM TMS_Load_Stops
GROUP BY [Load ID];

PIVOT не работает, потому что у вас есть дополнительные столбцы в поворотной таблице. Мне просто не нравится синтаксис или как он работает, но вы также можете исправить это, только выбрав нужные столбцы:

SELECT [Load ID], [1], [2], [3], [4]
FROM (SELECT [Load ID], [Sequence], [Stop Zip]
      FROM TMS_Load_Stops
     ) ls
PIVOT (
    MIN([Stop Zip])
    for [Sequence] IN ([1],[2],[3],[4])
    ) PivotTable
;
0 голосов
/ 11 января 2019

Вы должны «спроецировать» любой дополнительный столбец в TMS_Load_Stops до PIVOT, поскольку он уже выполняет группировку - используя все столбцы, не упомянутые в PIVOT:

SELECT [Load ID],[1],[2],[3],[4]
FROM (select [Load ID],[Sequence],[Stop Zip] from TMS_Load_Stops) t
PIVOT (
    MIN([Stop Zip])
    for [Sequence] IN ([1],[2],[3],[4])
    ) PivotTable
;
0 голосов
/ 11 января 2019

Если вы опустите предложение Group by, оно автоматически примет [Load ID] в качестве столбца группировки. У нас есть три типа столбцов в сводной таблице - группировка столбца, агрегирующий столбец и охватывающий столбец. Здесь группировка - [Идентификатор загрузки], охват - [Последовательность], а агрегирование - [Стоп Zip]. Используйте запрос ниже.

SELECT [Load ID],[1],[2],[3],[4]
FROM TMS_Load_Stops
PIVOT (
    MIN([Stop Zip])
    for [Sequence] IN ([1],[2],[3],[4])
    ) PivotTable
...