mysql - 按部分划分的销售和交易总额,按过去 24 个月分组

标签 mysql

SELECT det.partNum,
SUM(det.quantity) AS Demand1,
COUNT(det.partNum) AS Call1

FROM details det

JOIN invoice inv ON det.invoice_id = inv.id
WHERE inv.invoice_date
BETWEEN '2015-11-01 00:00:00'
AND '2015-11-31 23:59:59'

GROUP BY partNum

上述 SQL 返回当月所有零件编号、已售出总数(需求)以及零件涉及的交易总数(调用)。

我们的供应商想要的是每个零件的信息,而且还针对过去 24 个月的每个零件进行分组。他们请求的 csv 如下所示(如果仅查看最近 3 个月的数据):

Part# | Demand1 | Demand2 | Demand3 | Call1 | Call2 | Call3
123   |       0 |       2 |       0 |     0 |     1 |     0
345   |       6 |       3 |       4 |     1 |     2 |     3

Part# 123: 0 transactions this month (Call1) 0 quantity sold (Demand1)
       1 transaction last month (Call2) 2 quantity sold (Demand2).
       0 transactions two months ago (Call3) 0 quantity sold (Demand3).

Part# 345: 1 transaction this month (Call1) for qty sold of 6 (Demand1)
       2 transactions last month (Call2) for qty sold of 3 (Demand2)
       3 transactions two months ago (Call3) for qty sold of 4 (Demand3)

意识到他们希望将这一期限延长到过去 24 个月。 Demand1/Call1 始终为当前月份。

我使用 WHERE/BETWEEN 语句来显示日期的来源,并演示如何获得当月零件的准确报告。

我不知道该怎么做,就是填写 24 个月的需求和电话。这是供应商期望数据采用的格式。这不是我的选择。任何帮助使其按预期工作的帮助将不胜感激。

谢谢

编辑

我删除了 sql-server 标签。对于那个很抱歉。这只是 MySQL。

此外,我正在添加下面的回复...

研究 DATEDIFF、TIMESTAMPDIFF 甚至 PERIOD_DIFF。但实际上似乎没有一个能返回我需要的东西。需要做的是第一个需求列应该搜索当前月份第 1 天(含)到下个月第 1 天(不含)。下一个需求列应搜索当前月份 - 一个月第 1 天(含)到下个月 - 一个月第 1 天(不包括)。并且每个后续列都应该搜索相同的参数,每列减去一个额外的月份。我认为仅使用 DATEDIFF 无法精确地完成此任务。

我希望这是有道理的。

再次感谢您的帮助。

最佳答案

如果我正确理解你的问题,你可以这样做:

SELECT 
  det.partNum,
  SUM(case when inv.invoice_date >= dateadd(month, -3, @currMonth) and inv.invoice_date < dateadd(month, -2, @currMonth) then det.quantity else 0) AS Demand1,
  SUM(case when inv.invoice_date >= dateadd(month, -2, @currMonth) and inv.invoice_date < dateadd(month, -1, @currMonth) then det.quantity else 0) AS Demand2,
...
FROM details det

JOIN invoice inv ON det.invoice_id = inv.id
WHERE 
  inv.invoice_date >= '2015-11-01 00:00:00' AND inv.invoice_date < '2015-12-01'

GROUP BY partNum

这使用具有当月开始日期的变量来使 SQL 更简单。我还更改了 where 子句,您应该真正使用 >= + < 与日期而不是在日期之间。

关于mysql - 按部分划分的销售和交易总额,按过去 24 个月分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33790439/

相关文章:

MySQL 在随机结果中随机化

MySQL SELECT 模式替换为另一个表中的结果

java - 内存泄漏——Tomcat、Spring MVC

mysql - SQL:DATE_FORMAT() 和顺序

mysql - 优化包含重复查询作为子查询的 MySQL 查询?

mysql - SQL 条件排序依据?

mysql - 如何使用 DBI 将记录追加到数据库

mysql - 生成每个州销售的产品数量。 MySQL查询

mysql - 将 Null 与 MySQL 触发器中的另一个值进行比较

用于读取中间记录的 SQL