【问题标题】:How do I summarize sales data in SQL by month for last 24months?如何在 SQL 中按月汇总过去 24 个月的销售数据?
【发布时间】:2021-10-21 21:55:25
【问题描述】:

我在不同的日子里有大量不同产品的销售行。 我想检索每个产品和每个月的总和。过去 24 个月。

  1. 如何编写显示过去 24 个月的 WHERE 函数(基于表中的最新日期而非实际日期)?
  2. 如何按月而不是像 2018 年 1 月 24 日那样按天汇总和显示?

**Sample Data Table**
| SalesDate   | Product     | SLSqty |
| 2018-01-24  | Product A    | 25 |
| 2019-06-10  | Product B    | 10 |
| 2019-10-07  | Product C    | 4  |
| 2020-03-05  | Product A    | 20 |
| 2021-09-01  | Product A    | 50 |
| 2021-09-01  | Product B    | 10 |
| 2021-09-02  | Product C    | 3  |
| 2021-09-04  | Product A    | 50 |
| 2021-09-07  | Product B    | 10 |

**Expected Result**
| SalesMONTH  | Product      | SLSqty |
| 2019-10-31  | Product C    | 4  |
| 2020-03-31  | Product A    | 20 |
| 2021-09-30  | Product A    | 100|
| 2021-09-30  | Product A    | 20 |
| 2021-09-30  | Product B    | 3  |

【问题讨论】:

  • 您使用的是哪个 dbms?在日期/时间方面,许多产品远不符合 ANSI SQL。
  • 我们需要样本表数据预期结果。
  • 你需要使用window functions,它们的使用很大程度上取决于你的dbms

标签: sql


【解决方案1】:

我会创建一个参数来存储表中最新日期的值。然后你可以在你的 WHERE 子句中输入参数。

IF OBJECT_ID('TEMPDB..#TEMP') IS NOT NULL
    DROP TABLE #TEMP

CREATE TABLE #TEMP(
    [SalesDate]             DATE
    ,[product]              NVARCHAR(20)
    ,[SLSqty]               INT
)
INSERT INTO #TEMP([SalesDate],[product],[SLSqty])
VALUES('2018-01-24','Product A',25)
    ,('2019-06-10','Product B',10)
    ,('2019-10-07','Product C',4 )
    ,('2020-03-05','Product A',20)
    ,('2021-09-01','Product A',50)
    ,('2021-09-01','Product B',10)
    ,('2021-09-02','Product C',3 )
    ,('2021-09-04','Product A',50)
    ,('2021-09-07','Product B',10)

DECLARE @DATEVAR AS DATE = (SELECT MAX(#TEMP.SalesDate) FROM #TEMP)

最后一行声明了变量。如果您选择 @DATEVAR,您将获得由 select 语句定义的单个日期的输出:

然后您将其归入 where 子句。由于您希望在最晚日期之前 24 个月,我会在您的 where 子句中使用 DATEDIFF(MONTH,,) 函数。它输出整数个月,您只需将其限制为 24 个月或更短。

SELECT #TEMP.SalesDate
    ,#TEMP.product
    ,#TEMP.SLSqty
    ,DATEDIFF(MONTH,#TEMP.SalesDate,@DATEVAR) [# of months Diff]
FROM #TEMP
WHERE DATEDIFF(MONTH,#TEMP.SalesDate,@DATEVAR) <= 24

输出:

现在您必须汇总按年月和产品分组的销售额。 我通过计算像 202109(2021 年 9 月)这样的整数来计算年月

SELECT --#TEMP.SalesDate --(YOU HAVE TO TAKE THIS OUT FOR THE GROUP BY)
    YEAR(#TEMP.SalesDate)*100+MONTH(#TEMP.SalesDate) [year-month for GROUP BY]
    ,#TEMP.product
    ,SUM(#TEMP.SLSqty) SLSqty
--  ,DATEDIFF(MONTH,#TEMP.SalesDate,@DATEVAR) [# of months Diff] --(YOU HAVE TO TAKE THIS OUT FOR THE GROUP BY)
FROM #TEMP
WHERE DATEDIFF(MONTH,#TEMP.SalesDate,@DATEVAR) <= 24
GROUP BY YEAR(#TEMP.SalesDate)*100+MONTH(#TEMP.SalesDate)
    ,#TEMP.product

输出:

【讨论】:

    【解决方案2】:

    这是一些oracle sql:

    With data ( SalesDate,Product,SLSqty)as(
    Select to_date('2018-01-24'),'Product A',25 from dual union all
    Select to_date('2019-06-10'),'Product B',10 from dual union all
    Select to_date('2019-10-07'),'Product C',4 from dual union all
    Select to_date('2020-03-05'),'Product A',20 from dual union all
    Select to_date('2021-09-01'),'Product A',50 from dual union all
    Select to_date('2021-09-01'),'Product B',10 from dual union all
    Select to_date('2021-09-02'),'Product C',3 from dual union all
    Select to_date('2021-09-04'),'Product A',50 from dual union all
    Select to_date('2021-09-07'),'Product B',10 from dual),
    theLatest(SalesDate) as(
    select max(SalesDate) from data
    )
    
    select to_char(d.SalesDate,'YYYY-MM'),d.Product, sum(SLSqty)
    from data d
    Join theLatest on d.SalesDate >= add_months(theLatest.SalesDate,-24)
    group by to_char(d.SalesDate,'YYYY-MM'),d.Product
    order by to_char(d.SalesDate,'YYYY-MM')
    

    【讨论】:

      猜你喜欢
      • 2018-11-16
      • 1970-01-01
      • 1970-01-01
      • 2015-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-10
      相关资源
      最近更新 更多