以下查询返回销售月份的值,但不会返回销售额为零的月份:
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
目标是让它在没有销售的几个月内返回零值。任何人都可以看到缺少的东西吗?
提前谢谢你,
奥维尔
答案 0 :(得分:1)
虽然并非不可能,但在SQL中执行此操作并不容易。
由于它主要是一个演示文稿问题,因此在您在问题中执行查询后,通过迭代结果并检查缺少的月份,可能更容易在客户端中添加缺少的行。
答案 1 :(得分:0)
由于您使用的是mysql,如果某些用户没有订单会有几个月的时间,那么就没有纯粹的SQL解决方案。
基本上,纯sql所需的最小值(在mysql和其他不支持递归查询的RDBMS中)是每个月都有一个整数序列的临时表。
建立这样的表可以作为月度报告的常规部分来完成,因此它不是一个人为的要求 - 同时您可以跟踪与此数据相关的一些其他信息(例如,您可以定义您的财务月份何时开始并结束,或者你可以跟踪汇率等。)。
另一方面,如果你真的,真的想要纯粹的SQL看看这个answer - 它是一个黑客,你将受到最大日期范围的限制,性能不是很好,但这是我发现的最好的mysql。