sql-server 按缺少月份的月份列出的累计总和

x33g5p2x  于 2022-10-31  发布在  其他
关注(0)|答案(1)|浏览(155)

我必须按月累计和数量,但在某些月份没有数量,SQL不显示这些行。
我已经尝试了很多其他的解决方案,但是没有一个能成功,或者至少我不能让它们成功。目前,我的代码如下:

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

结果如下:
| 起始日期|截止日期|O类型|项目代码|数量|
| - -|- -|- -|- -|- -|
| 2021年1月1日|2021年1月31日|类型1|一个|十九个|
| 2021年1月1日|2021年2月28日|类型1|一个|九十六个|
| 2021年1月1日|2021年3月31日|类型1|一个|一百一十六个|
| 2021年1月1日|2021年4月30日|类型1|一个|一百三十八|
| 2021年1月1日|2021年6月30日|类型1|一个|一百七十八|
| 2021年1月1日|2021年7月31日|类型1|一个|二百零三人|
| 2021年1月1日|2021年8月31日|类型1|一个|二百二十八人|
| 2021年1月1日|2021年9月30日|类型1|一个|二百五十三|
| 2021年1月1日|2021年11月30日|类型1|一个|三百三十人|
| 2021年1月1日|2021年12月31日|类型1|一个|三百六十四|
| 2022年1月1日|2022年2月28日|类型1|一个|十八岁|
| 2022年1月1日|2022年3月31日|类型1|一个|四十二|
| 2022年1月1日|2022年4月30日|类型1|一个|五十三个|
我期待着这样的结果:
| 起始日期|截止日期|O类型|项目代码|数量|
| - -|- -|- -|- -|- -|
| 2021年1月1日|2021年1月31日|类型1|一个|十九个|
| 2021年1月1日|2021年2月28日|类型1|一个|九十六个|
| 2021年1月1日|2021年3月31日|类型1|一个|一百一十六个|
| 2021年1月1日|2021年4月30日|类型1|一个|一百三十八|
| 2021年1月1日|2021年5月31日|类型1|一个|一百三十八|
| 2021年1月1日|2021年6月30日|类型1|一个|一百七十八|
| 2021年1月1日|2021年7月31日|类型1|一个|二百零三人|
| 2021年1月1日|2021年8月31日|类型1|一个|二百二十八人|
| 2021年1月1日|2021年9月30日|类型1|一个|二百五十三|
| 2021年1月1日|2021年10月31日|类型1|一个|二百五十三|
| 2021年1月1日|2021年11月30日|类型1|一个|三百三十人|
| 2021年1月1日|2021年12月31日|类型1|一个|三百六十四|
| 2022年1月1日|2022年2月28日|类型1|一个|十八岁|
| 2022年1月1日|2022年3月31日|类型1|一个|四十二|
| 2022年1月1日|2022年4月30日|类型1|一个|五十三个|
SQL Fiddle链接:http://www.sqlfiddle.com/#!18/04a997/1
我真的很感激你的帮助谢谢

c6ubokkw

c6ubokkw1#

这里有一种方法:

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;

这把小提琴的工作示例。

相关问题