2012-07-09 86 views
0

我需要收集特定类别项目上的销售额总和,并按选定日期范围按日期分组(可能是从一周到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 

回答

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已经有你正在寻找的所有日期。

+0

嗨Holger,这很好,因为它可以让我删除日期表的需要......但我似乎无法返回0天的10天范围内没有条目的日期“产品”表..所以天:01,02,05,08,09,10。我能做些什么来调整?谢谢M – 2012-07-10 01:44:45

+0

@MarcoPolo,我切换了IFNULL和SUM的顺序。这应该解决它。或者,也可以不使用IFNULL和SUM,而使用TOTAL(),但返回浮点数(0.0)。 – 2012-07-10 02:55:01

+0

嗨Holger,我稍微修改了你的代码,因为我仍然无法完成它的工作,但它仍然没有条目的日子里被砍掉。所以我搬了“P.ProductCat = 29“进入JOIN位,并将日期范围留在WHERE中,似乎可以工作:)谢谢你指出我正确的方向。 – 2012-07-10 05:49:26