我需要收集特定類別項目上的銷售額總和,並按選定日期範圍按日期分組(可能是從一週到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