У меня есть таблица с 3 столбцами (год, месяц, значение), как это в Sql Server:
Мне нужен запрос SQL для вычисления ValueOfLastTwelveMonths.
SELECT Year,
Month,
Value,
SUM (Value) OVER (PARTITION BY Year, Month)
FROM MyTable
Это намного проще, если у вас есть строка для каждого месяца и года, а затем (при необходимости) вы можете отфильтровать строки NULL
. Причина, по которой это проще, заключается в том, что тогда вы знаете, на сколько строк вам нужно оглянуться назад: 11.
Если вы создадите набор данных по годам и месяцам, вы сможете LEFT JOIN
сопоставить свои данные, агрегировать, а затем, наконец, отфильтровать данные:
SELECT *
INTO dbo.YourTable
FROM (VALUES(2021,1,30),
(2021,2,24),
(2021,5,26),
(2021,11,12),
(2022,1,25),
(2022,2,40),
(2022,4,20))V(Year,Month,Value);
GO
WITH YearMonth AS(
SELECT YT.Year,
V.Month
FROM (SELECT DISTINCT Year
FROM dbo.YourTable) YT
CROSS APPLY (VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12))V(Month)),
RunningTotal AS(
SELECT YM.Year,
YM.Month,
YT.Value,
SUM(YT.Value) OVER (ORDER BY YM.Year, YM.Month
ROWS BETWEEN 11 PRECEDING AND CURRENT ROW) AS Last12Months
FROM YearMonth YM
LEFT JOIN dbo.YourTable YT ON YM.Year = YT.Year
AND YM.Month = YT.Month)
SELECT Year,
Month,
Value,
Last12Months
FROM RunningTotal
WHERE Value IS NOT NULL;
GO
DROP TABLE dbo.YourTable;
Пожалуйста, не используйте уценку кода для всего, уценка кода предназначена для кода. Также не отмечайте конфликтующие товары.