【问题标题】:Displaying zero valued months with SQL使用 SQL 显示零值月份
【发布时间】:2010-04-19 19:28:23
【问题描述】:

以下查询返回销售额月份的值,但不返回销售额为零的月份的值:

SELECT DATE_FORMAT(O.OrderDate, "%b, %Y") AS MonthYear, SUM(O.Total * C.Rate) AS Sales 
FROM (Orders O INNER JOIN OrdersStates OS ON O.OrderID = OS.OrderID)
INNER JOIN Users U ON U.UserID = O.UserID
INNER JOIN UsersDescription UD ON U.UserID = UD.UserID
INNER JOIN States S ON S.StateID = OS.StateID INNER JOIN Currencies C ON O.Currency = C.Abb 
WHERE O.OrderDate >= '2009-10-01 00:00:00' AND O.OrderDate < '2010-04-19 23:59:59' 
GROUP BY MonthYear ORDER BY MonthYear

目标是让它在没有销售的月份返回零值。任何人都可以看到缺少什么吗?

提前谢谢你,

奥维尔

【问题讨论】:

  • 因为您的数据中不存在日期,您需要构建一个日期值列表,并将 ORDERS 表左连接到该列表...
  • 如果没有销售,该字段是空还是零?
  • 如果我没看错,这里有一个最近的类似问题stackoverflow.com/questions/2651249/…
  • 我不做 MySQL,所以我不想发布答案,但是在 TSql 中,我们会做类似Sum(ISNULL(O.Total, 0) * ISNULL(C.Rate, 0)) as Sales

标签: sql mysql


【解决方案1】:

虽然不是不可能,但在 SQL 中做到这一点并不容易。

由于这主要是一个演示问题,在您执行问题中的查询后,通过迭代结果并检查缺失的月份,在客户端中添加缺失的行可能会更容易。

【讨论】:

  • 我最终在 PHP 中完成了这项工作。尝试在 SQL 中执行此操作会使原始查询变得复杂,超出我的处理能力。
【解决方案2】:

由于您使用的是 mysql,因此如果有几个月没有某些用户的订单,则没有纯 SQL 的干净解决方案。

基本上,对于纯 sql(在 mysql 和其他不支持递归查询的 RDBMS 中),您需要的最低要求是每个月包含一个整数序列的临时表。

建立这样的表格可以作为每月报告的常规部分,所以这不是一个人为的要求 - 同时您可以跟踪与此数据相关的一些其他信息(例如,您可以定义您的财务月份何时开始和结束,或者您可以跟踪汇率等)。

另一方面,如果你真的,真的想要纯 sql 看看这个answer - 这是一个 hack,你会受到最大日期范围的限制,性能也不是很好,但这是最好的我找到了mysql。

【讨论】:

  • 感谢您的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多