我需要收集某个类别项目的销售额,按天分组选定的日期范围(可能是从一周到12周),并且在没有发生交易的日子里返回0而不是NULL。
我最初的想法是使用一个名为“日历”的预先填充的表格(如下所示),该表格有大约10年的日期,我可以将我的“产品”表格左键加入,以获得没有销售的日子为0 SUM
结果太大而无法处理,因此我尝试首先将选定的日期范围复制到名为“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
“日期表”表(这是空的,有两列要从“日历”表预填充,因此LEFT JOIN的日期范围数据更紧凑):
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
答案 0 :(得分:0)
你几乎得到了你需要的东西。但是,您不需要日期表。
您的查询应如下所示:
SELECT C.IsoDate, C.DayNameOfWeek, IFNULL(SUM(P.Amount),0) AS AmountSummed
FROM calendar C LEFT JOIN products P ON C.IsoDate=P.ExpDate
WHERE C.IsoDate BETWEEN '2012-07-01' AND '2012-07-10'
AND P.ProductCat = 29
GROUP BY C.IsoDate, C.DayNameOfWeek
ORDER BY C.IsoDate
如果您真的想要使用datetable
,只需将其替换为calendar
并删除C.IsoDate BETWEEN '2012-07-01' AND '2012-07-10'
(假设datetable
在开始之前为空),因为datetime
已经拥有您要查找的所有日期。