【发布时间】:2021-04-02 19:15:05
【问题描述】:
我正在处理site 提供的订单表,它有自己的编辑器,您可以在其中测试您的 SQL 语句。
订单表是这样的
| order_id | customer_id | order_date |
|---|---|---|
| 1 | 7000 | 2016/04/18 |
| 2 | 5000 | 2016/04/18 |
| 3 | 8000 | 2016/04/19 |
| 4 | 4000 | 2016/04/20 |
| 5 | NULL | 2016/05/01 |
我想获取后续月份订单数量的差异。
详细来说,每个月的订单数是这样的
SQL 语句
SELECT
MONTH(order_date) AS Month,
COUNT(MONTH(order_date)) AS Total_Orders
FROM
orders
GROUP BY
MONTH(order_date)
结果:
| Month | Total_Orders |
|---|---|
| 4 | 4 |
| 5 | 1 |
现在我的目标是在接下来的几个月中获得差异
| Month | Total_Orders | Total_Orders_Diff |
|---|---|---|
| 4 | 4 | 4 - Null = Null |
| 5 | 1 | 1 - 4 = -3 |
我的策略是自行加入this answer
这是我的尝试
SELECT
MONTH(a.order_date),
COUNT(MONTH(a.order_date)),
COUNT(MONTH(b.order_date)) - COUNT(MONTH(a.order_date)) AS prev,
MONTH(b.order_date)
FROM
orders a
LEFT JOIN
orders b ON MONTH(a.order_date) = MONTH(b.order_date) - 1
GROUP BY
MONTH(a.order_date)
但是,结果只是零(如下所示),这表明我只是从相同的值中减去而不是从上个月减去(或从空值中减去)
| MONTH(a.order_date) | COUNT(MONTH(a.order_date)) | prev | MONTH(b.order_date) |
|---|---|---|---|
| 4 | 4 | 0 | NULL |
| 5 | 1 | 0 | NULL |
你对我做错了什么有什么建议吗?
【问题讨论】:
-
你的任务很适合窗口函数和
lag() -
@Stu 假设(与我的任务相关)窗口函数不可用。这基本上意味着有一个不依赖于滞后的解决方案
-
啊 - 好吧,我刚刚发布了一个使用
lag的示例 - 抱歉,您没有提供不要使用的语法列表,哈哈 ;-)
标签: sql sql-server join left-join self-join