#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];