Сводные данные в SQL С запросом

#sql #sql-server

#sql #sql-сервер

Вопрос:

Приведенный ниже запрос возвращает СУММУ количеств, приобретенных за последние три года. Моя попытка заключалась в том, чтобы обернуть весь блок кода, начиная с «С» и заканчивая «ГДЕ» запроса покупок, но я не могу заставить сводную работу работать. Мне также интересно, можно ли динамически генерировать сводные столбцы YEAR вместо передачи с использованием синтаксиса FOR -> IN Pivot.

 WITH Purchases (ItemCode, Quantity, DocDate)  
AS  
(  
    SELECT ItemCode, Quantity, OPOR.DocDate
    FROM OPOR INNER JOIN POR1 ON OPOR.DocEntry = POR1.DocEntry 
    WHERE Canceled = 'N'                       
    GROUP BY OPOR.DocDate,ItemCode,QuantitY
)  
SELECT ItemCode, SUM(Quantity) AS Qty, YEAR(DocDate) AS Year
FROM Purchases
WHERE DocDate > DATEADD(YEAR,-4,GETDATE()) AND ItemCode = 'Apple'
GROUP BY ItemCode, YEAR(DocDate)
ORDER BY ItemCode;
  

Результат

  ---------- ------ ------ 
| ItemCode | Qty  | Year |
 ---------- ------ ------ 
| Apple    | 2300 | 2017 |
 ---------- ------ ------ 
| Apple    | 1600 | 2018 |
 ---------- ------ ------ 
| Apple    | 1000 | 2019 |
 ---------- ------ ------ 
| Apple    | 1400 | 2020 |
 ---------- ------ ------ 
  

Я хотел бы повернуть столбец year, чтобы получить следующий результат:

  ---------- ------ ------ ------ ------ 
| ItemCode | 2017 | 2018 | 2019 | 2020 |
 ---------- ------ ------ ------ ------ 
| Apple    | 2300 | 1600 | 1000 | 1400 |
 ---------- ------ ------ ------ ------ 

  

Комментарии:

1. Так что попробуйте и дайте нам знать, как у вас дела, или если вы застряли.

2. Особенно учитывая, что для вас уже был написан сводный файл в предыдущем вопросе, по крайней мере, попробуйте в этот раз.

Ответ №1:

Вы можете использовать функцию Pivot в SQL Server:

ДЕМОНСТРАЦИЯ

 SELECT * FROM TABLE1
PIVOT(MIN(QTY) FOR [YEAR] IN ([2017], [2018], [2019], [2020])) PIVOT_TABLE;
  

Ответ №2:

Если OP предпочитает условную агрегацию сводному SQL Server

 SELECT [ItemCode],
  max(case when [YEAR]=2017 then QTY else null end) [2017],
  max(case when [YEAR]=2018 then QTY else null end) [2018],
  max(case when [YEAR]=2019 then QTY else null end) [2019],
  max(case when [YEAR]=2020 then QTY else null end) [2020]
FROM TABLE1
group by [ItemCode];