【问题标题】:SQL - Display sales this month and last month in the same tableSQL - 在同一张表中显示本月和上月的销售额
【发布时间】:2020-09-21 19:03:30
【问题描述】:

我使用的是 SQL Server 2018,我有一个名为 SALES 的表,看起来像这样

SALES_PERSON_ID MONTH   SALES
001             Aug-20  3
002             Aug-20  2
003             Aug-20  0
001             Sep-20  4
002             Sep-20  2
003             Sep-20  3

每个新月都会添加到表格中,显示每个销售人员的累计销售额。

我想将此数据总结为本月与上个月的销售额,我是这样做的:

SELECT 
   tb1.SALES_PERSON_ID
  ,SALES_THIS_MONTH
  ,SALES_LAST_MONTH
FROM 
   (SELECT SALES_PERSON_ID, MONTH, SUM(SALES) AS SALES_THIS_MONTH 
    FROM SALES
    WHERE MONTH = 'Sep-20') AS tb1
JOIN
   (SELECT SALES_PERSON_ID, MONTH, SUM(SALES) AS SALES_LAST_MONTH
    FROM SALES
    WHERE MONTH = 'Aug-20') AS tb2
ON. tb1.SALES_PERSON_ID = tb2.SALES_PERSON_ID

如果 9 月 20 日是当前月份,那么它会给我这样的信息:

SALES_PERSON_ID SALES_THIS_MONTH SALES_LAST_MONTH
001             4                3
002             2                2
003             3                0

这很好用,但实际上我有数百个月的数十万条记录,我无法在 WHERE 子句中“硬编码”所有可能月份的日期。我想要一个动态解决方案,该解决方案将始终提供给定月份的销售额总和,以及特定于该记录的上个月的销售额总和。

所以我需要我的 tb2 以某种方式始终知道 tb1 指的是哪个月份,然后减去一个月。任何帮助将不胜感激!

【问题讨论】:

  • 您在子查询中缺少GROUP BY
  • Y2K 20 年后,但我们继续避免吸取教训。好难过!
  • 没有 SQL Server 2018 版本 - 我们有 2012、2014、2016、2017 和 2019 - 任君选择

标签: sql sql-server tsql


【解决方案1】:

使用lag():

select s.*,
       lag(sales) over (partition by SALES_PERSON_ID order by month) as prev_sales
from sales s;

这假定month 确实是date。如果不是,您可以使用:

       lag(sales) over (partition by SALES_PERSON_ID order by convert(date, '01-' + month)) as prev_sales

如果您只想过滤最近一个月,请使用lag() 的子查询:

select s.*
from (select s.*,
             lag(sales) over (partition by SALES_PERSON_ID order by month) as prev_sales
      from sales s
     ) s
where s.month = dateadd(day, 1, eomonth(getdate(), -1))

【讨论】:

    猜你喜欢
    • 2021-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多