即使值为空,也可以获取过去12个月的总销售额

时间:2020-07-07 10:45:14

标签: sql sql-server tsql

我有以下代码,其中当前给出了当年的按月销售总额,我需要获得从上一年的上个月到今年的本月的销售总额。

我的查询如下:

;WITH mcte AS (
 SELECT DATEADD(year, -1, getdate()) as MONTH_NAME
 UNION ALL
 SELECT DATEADD(MONTH,1,MONTH_NAME)
 FROM mcte
 WHERE DATEPART(MONTH,MONTH_NAME) < 12),octe AS(
 SELECT (DATENAME (MONTH, DATEADD ( MONTH, DATEPART(MONTH, OI.CreatedDate), -1) )) AS MONTH_NAME,
 SUM (OI.ItemQty * OI.TotalPrice) AS TOTAL_SALES
 FROM Order_Item OI            
 GROUP BY MONTH(OI.CreatedDate))
 SELECT DATENAME(MONTH,m.MONTH_NAME) + '' + DATENAME(YEAR,m.MONTH_NAME) as 
 MONTH_NAME, o.TOTAL_SALES FROM mcte m LEFT JOIN octe o ON o.MONTH_NAME = DATENAME(MONTH,m.MONTH_NAME)

我正在获取记录

MONTH_NAME     TOTAL_SALES
July2019       54023.45
August2019     NULL
December2019   NULL
September2019  NULL
October2019    NULL
November2019   NULL

这里我仅获取上一年的数据,而没有获取本年度的数据。任何人都可以指导我。

谢谢

2 个答案:

答案 0 :(得分:1)

您最多只能产生12个月的时间。请尝试将第一个CTE替换为:

WITH mcte AS (
      SELECT DATEADD(year, -1, getdate()) as MONTH_NAME
      UNION ALL
      SELECT DATEADD(MONTH,1,MONTH_NAME)
      FROM mcte
      WHERE month_name < GETDATE()
     ),

请注意,区别在于WHERE子句。

整个查询应如下所示:

WITH months AS (
      SELECT DATEFROMPARTS(YEAR(getdate()) - 1, MONTH(getdate()), 1) as month
      UNION ALL
      SELECT DATEADD(MONTH, 1, month)
      FROM months
      WHERE EOMONTH(month) < GETDATE()
     )
SELECT m.month, SUM(OI.ItemQty * OI.TotalPrice) AS TOTAL_SALES
FROM months m LEFT JOIN
     Order_Item OI oi
     ON oi.CreatedDate >= m.month AND
        oi.CreatedDate < DATEAADD(month, 1, m.month)          
GROUP BY m.month

答案 1 :(得分:0)

尝试这样做:

DECLARE @CurDate DATE = GET_DATE()
DECLARE @OneYearPrior DATE = DATEADD(YEAR, -1, @CurDate)

WITH relevant_months(start_date, month_of_sale, year_of_sale) AS (
    SELECT 
        @CurDate AS start_date, 
        MONTH(@CurDate) as month_of_sale, 
        YEAR(@CurDate) as year_of_sale
    UNION ALL
    SELECT DATEADD(MONTH, -1, start_date) AS start_date,
        MONTH(DATEADD(MONTH, -1, start_date)) as month_of_sale, 
        YEAR(DATEADD(MONTH, -1, start_date)) AS year_of_sale
    FROM relevant_months
    WHERE DATEADD(MONTH, -1, start_date) >= @OneYearPrior
),
relevant_data AS (
    SELECT OI.CreatedDate, 
        OI.ItemQty, 
        OI.TotalPrice, 
        MONTH(OI.CreatedDate), AS month_of_sale, 
        YEAR(OI.CreatedDate) AS year_of_sale
    FROM Order_Item OI
    WHERE OI.CreatedDate >= DATEADD(YEAR, -1, GETDATE())
)
SELECT rm.month_of_sale as month, rm.year_of_sale as year, 
    SUM(rd.ItemQty*rd.TotalPrice) as total_sales
FROM relevant_months rm
LEFT JOIN relevant_data rd
    ON rm.month_of_sale = rd.month_of_sale
    AND rm.year_of_sale = rd.year_of_sale
GROUP BY rm.month_of_sale, rm.year_of_sale
ORDER BY rm.year_of_sale asc, rm.month_of_sale asc