Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Cumulative sum by month with missing months

I have to cumulative sum by month a quantity but in some months there’s no quantity and SQL does not show these rows.

I have tried multiple other solutions I found here but none of them worked or at least I couldn’t get them working. Currently, my code is as follows:

SELECT DISTINCT
         A.FromDate
        ,A.ToDate
        ,A.OperationType
        ,A.[ItemCode]
        ,SUM(A.[Quantity]) OVER (PARTITION BY [ItemCode],OperationType,YEAR ORDER BY MONTH) [Quantity]

 FROM (
        SELECT 
         CONVERT(DATE,DATEADD(yy, DATEDIFF(yy, 0, T.OrderDate), 0)) AS FromDate
        ,EOMONTH(T.OrderDate) ToDate
        ,DATEPART(MONTH, t.OrderDate) AS [Month]
                ,DATEPART(YEAR, t.OrderDate) AS [Year]
                ,SUM(T.[Quantity]) [Quantity]
        ,OperationType
        ,[ItemCode]
        FROM TEST T

        WHERE [ItemCode] != ''

        GROUP BY T.OrderDate,[ItemCode],OperationType
        
      ) A

With these results:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

FromDate ToDate OType ItemCode Quantity
2021-01-01 2021-01-31 Type1 1 19
2021-01-01 2021-02-28 Type1 1 96
2021-01-01 2021-03-31 Type1 1 116
2021-01-01 2021-04-30 Type1 1 138
2021-01-01 2021-06-30 Type1 1 178
2021-01-01 2021-07-31 Type1 1 203
2021-01-01 2021-08-31 Type1 1 228
2021-01-01 2021-09-30 Type1 1 253
2021-01-01 2021-11-30 Type1 1 330
2021-01-01 2021-12-31 Type1 1 364
2022-01-01 2022-02-28 Type1 1 18
2022-01-01 2022-03-31 Type1 1 42
2022-01-01 2022-04-30 Type1 1 53

And I was expecting these results:

FromDate ToDate OType ItemCode Quantity
2021-01-01 2021-01-31 Type1 1 19
2021-01-01 2021-02-28 Type1 1 96
2021-01-01 2021-03-31 Type1 1 116
2021-01-01 2021-04-30 Type1 1 138
2021-01-01 2021-05-31 Type1 1 138
2021-01-01 2021-06-30 Type1 1 178
2021-01-01 2021-07-31 Type1 1 203
2021-01-01 2021-08-31 Type1 1 228
2021-01-01 2021-09-30 Type1 1 253
2021-01-01 2021-10-31 Type1 1 253
2021-01-01 2021-11-30 Type1 1 330
2021-01-01 2021-12-31 Type1 1 364
2022-01-01 2022-02-28 Type1 1 18
2022-01-01 2022-03-31 Type1 1 42
2022-01-01 2022-04-30 Type1 1 53

SQL Fiddle link: http://www.sqlfiddle.com/#!18/04a997/1

I would really appreciate some help. Thank you

>Solution :

Here is one way:

WITH m(Earliest,Latest) AS
(
  SELECT DATEADD(DAY,1,MIN(EOMONTH(OrderDate,-1))),
    MAX(EOMONTH(OrderDate)) FROM dbo.TEST
), TypeCodes AS 
(
  SELECT DISTINCT ItemCode, OperationType
  FROM dbo.TEST
), Months AS
(
  SELECT Month = DATEADD(MONTH, ROW_NUMBER() 
    OVER (ORDER BY @@SPID)-1, Earliest)
  FROM m CROSS APPLY STRING_SPLIT(REPLICATE(',',
    DATEDIFF(MONTH,Earliest,Latest)),',')
), raw AS
(
  SELECT m.Month, i.OperationType, i.ItemCode, 
    Q = COALESCE(SUM(Quantity),0)
  FROM Months AS m
  CROSS JOIN TypeCodes AS i
  LEFT OUTER JOIN dbo.TEST AS t
  ON t.OrderDate >= m.Month
  AND t.OrderDate < DATEADD(MONTH, 1, m.Month)
  AND i.ItemCode = t.ItemCode
  AND i.OperationType = t.OperationType
  GROUP BY m.Month, i.OperationType, i.ItemCode
)
SELECT FromDate = Month, 
       ToDate = EOMONTH(Month),
       OperationType, 
       ItemCode, 
       Quantity = SUM(Q) OVER (ORDER BY Month)
FROM raw;

Working example in this fiddle.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading