使用SQL显示零值月份

时间:2010-04-19 19:28:23

标签: sql mysql

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

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

目标是让它在没有销售的几个月内返回零值。任何人都可以看到缺少的东西吗?

提前谢谢你,

奥维尔

2 个答案:

答案 0 :(得分:1)

虽然并非不可能,但在SQL中执行此操作并不容易。

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

答案 1 :(得分:0)

由于您使用的是mysql,如果某些用户没有订单会有几个月的时间,那么就没有纯粹的SQL解决方案。

基本上,纯sql所需的最小值(在mysql和其他不支持递归查询的RDBMS中)是每个月都有一个整数序列的临时表。

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

另一方面,如果你真的,真的想要纯粹的SQL看看这个answer - 它是一个黑客,你将受到最大日期范围的限制,性能不是很好,但这是我发现的最好的mysql。