我需要收集特定类别项目上的销售额总和,并按选定日期范围按日期分组(可能是从一周到12周),并返回0而不是NULL没有发生交易的日子。按日期范围加入,按汇总汇总
我最初的想法是使用一个名为“日历”(如下所示)的预先填写的表格,它具有大约10年的日期,我可以左键加入我的“产品”表格以获得无销售日期的日期,作为0和。
结果太大无法处理,所以我试图先将选定的日期范围复制到一个名为“datetable”的空表中,它与“calendar”共享相同的列名称。所以我有3个表:
“日历”表。它拥有10年价值日期与下面的列名:
IsoDate DayNameOfWeek
2012-01-01 Sun
2012-01-02 Mon
2012-01-03 Tue
2012-01-04 Wed
2012-01-05 Thu
2012-01-06 Fri
2012-01-07 Sat
2012-01-08 Sun
2012-01-09 Mon
2012-01-10 Tue
etc for 10yrs
“datetable”表(这是创建空的有两列由“日历”表预填所以左边的日期范围的数据连接是更紧凑):
IsoDate DayNameOfWeek
“产品” 表。这就是我存储销售每个ProductCat:
ExpDate ProductCat Amount
2012-01-03 28 232
2012-01-04 29 100
2012-01-04 29 1002
2012-01-06 12 12
2012-01-06 29 9
2012-01-07 10 100
2012-01-07 29 122
2012-01-07 29 17
输出我在寻找基于单“ProductCat”号,在这种情况下,29:
IsoDate DayNameOfWeek AmountSummed
2012-01-01 Sun 0
2012-01-02 Mon 0
2012-01-03 Tue 0
2012-01-04 Wed 1102
2012-01-05 Thu 0
2012-01-06 Fri 9
2012-01-07 Sat 139
2012-01-08 Sun 0
2012-01-09 Mon 0
2012-01-10 Tue 0
我的代码下面。该初始插件工作正常,但我不知道语法,这将使第二部分与JOIN和SUM工作:
INSERT INTO datetable (IsoDate, DayNameOfWeek)
SELECT IsoDate, DayNameOfWeek
FROM calendar
WHERE IsoDate
BETWEEN '2012-07-01' AND '2012-07-10'
SELECT ExpDate, SUM(IFNULL(Amount, 0))
AS AmountSummed
FROM products
WHERE ProductCat = 29
AND ExpDate BETWEEN '2012-07-01' AND '2012-07-10'
LEFT JOIN products
ON datetable.IsoDate=products.ExpDate
GROUP BY datetable.IsoDate
编辑
这是现在工作的代码:
SELECT C.IsoDate,IFNULL(SUM(P.Amount),0) AS AmountSummed
FROM calendar C LEFT OUTER JOIN products P ON C.IsoDate=P.ExpDate
AND P.ProductCat = 29
WHERE C.IsoDate BETWEEN '2012-07-01' AND '2012-07-10'
GROUP BY C.IsoDate, C.DayNameOfWeek
ORDER BY C.IsoDate
嗨Holger,这很好,因为它可以让我删除日期表的需要......但我似乎无法返回0天的10天范围内没有条目的日期“产品”表..所以天:01,02,05,08,09,10。我能做些什么来调整?谢谢M – 2012-07-10 01:44:45
@MarcoPolo,我切换了IFNULL和SUM的顺序。这应该解决它。或者,也可以不使用IFNULL和SUM,而使用TOTAL(),但返回浮点数(0.0)。 – 2012-07-10 02:55:01
嗨Holger,我稍微修改了你的代码,因为我仍然无法完成它的工作,但它仍然没有条目的日子里被砍掉。所以我搬了“P.ProductCat = 29“进入JOIN位,并将日期范围留在WHERE中,似乎可以工作:)谢谢你指出我正确的方向。 – 2012-07-10 05:49:26