Сумма за последние 12 месяцев

У меня есть таблица с 3 столбцами (год, месяц, значение), как это в Sql Server:

Год Месяц Ценить ValueOfLastTwelveMonths 2021 1 30 30 2021 2 24 54 (30 + 24) 2021 5 26 80 (54+26) 2021 11 12 92 (80+12) 2022 1 25 87 (СУММА значений с 1 2022 ПО 2 2021) 2022 2 40 103 (СУММА значений со 2 2022 ПО 3 2021) 2022 4 20 123 (СУММА значений с 4 2022 ПО 5 2021)

Мне нужен запрос SQL для вычисления ValueOfLastTwelveMonths.

SELECT Year,
        Month,
        Value,
        SUM (Value) OVER (PARTITION BY Year, Month)
FROM MyTable

Пожалуйста, не используйте уценку кода для всего, уценка кода предназначена для кода. Также не отмечайте конфликтующие товары.

Larnu 14.02.2023 15:39
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
1
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это намного проще, если у вас есть строка для каждого месяца и года, а затем (при необходимости) вы можете отфильтровать строки 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;

Другие вопросы по теме