2012-07-09 84 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