加入日期范围,按SUM汇总

时间:2012-07-09 12:26:07

标签: sql sqlite group-by

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

1 个答案:

答案 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已经拥有您要查找的所有日期。