T-SQL - скользящая сумма за 3 месяца - предшествующие нулевые значения - PullRequest
0 голосов
/ 30 апреля 2018

Использование SQL Server 2016. У меня есть следующая таблица данных (пример)

Target Date Total
-----------------
2018-01-24  1
2018-02-28  1
2018-03-02  1
2018-03-08  1
2018-03-15  1
2018-03-30  1
2018-04-16  1
2018-04-18  1
2018-04-30  1

Я хотел бы получить 3-месячную скользящую сумму (группировка по месяцам):

  Target Date   Total_Sum
  -----------------------
  2018-01-01      1
  2018-02-01      2
  2018-03-01      6
  2018-04-01      8

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Пожалуйста, попробуйте следующий код

;WITH CTE(TargetDate,Total)
AS
(
SELECT '2018-01-24', 1 UNION ALL
SELECT '2018-02-28', 1 UNION ALL
SELECT '2018-03-02', 1 UNION ALL
SELECT '2018-03-08', 1 UNION ALL
SELECT '2018-03-15', 1 UNION ALL
SELECT '2018-03-30', 1 UNION ALL
SELECT '2018-04-16', 1 UNION ALL
SELECT '2018-04-18', 1 UNION ALL
SELECT '2018-04-30', 1
)
SELECT STUFF(TargetDate,9,2,'01') AS TargetDate
      ,Total_Sum
FROM
(
    SELECT TargetDate,Total_Sum 
       ,ROW_NUMBER()OVER(PARTITION BY Total_Sum ORDER BY TargetDate) AS Seq
    FROM 
    (
        SELECT  TargetDate
                ,SUM(Total )OVER(ORDER BY MONTH(TargetDate) ) AS Total_Sum
        FROM CTE
    )dt
)fnl 
WHERE Seq=1 

Результат

TargetDate  Total_Sum
---------------------
2018-01-01      1
2018-02-01      2
2018-03-01      6
2018-04-01      9
0 голосов
/ 30 апреля 2018

Хорошо, это должно получить ответ, который вы хотите. Сначала вам нужно подвести итоги ваших месяцев, затем вы можете сделать промежуточные итоги за последние 3 месяца:

CREATE TABLE SampleTable (TargetDate date, Total int);
GO

INSERT INTO SampleTable
VALUES ('20180124', 1),
       ('20180228', 1),
       ('20180302', 1),
       ('20180308', 1),
       ('20180315', 1),
       ('20180330', 1),
       ('20180416', 1),
       ('20180418', 1),
       ('20180430', 1);
GO

SELECT *
FROM SampleTable;
GO
WITH Months AS (
    SELECT DATEADD(MONTH,DATEDIFF(MONTH, 0, TargetDate),0) AS TargetMonth, SUM(Total) AS MonthTotal
    FROM SampleTable
    GROUP BY DATEADD(MONTH,DATEDIFF(MONTH, 0, TargetDate),0))
SELECT TargetMonth,
       SUM(MonthTotal) OVER (ORDER BY TargetMonth ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS Last3Months
FROM Months;

GO
DROP TABLE SampleTable;
GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...