2010-04-19 64 views
1

下面的查詢返回值與銷售幾個月,但不是個月其銷售額爲零:顯示零值月與SQL

SELECT DATE_FORMAT(O.OrderDate, "%b, %Y") AS MonthYear, SUM(O.Total * C.Rate) AS Sales 
FROM (Orders O INNER JOIN OrdersStates OS ON O.OrderID = OS.OrderID) 
INNER JOIN Users U ON U.UserID = O.UserID 
INNER JOIN UsersDescription UD ON U.UserID = UD.UserID 
INNER JOIN States S ON S.StateID = OS.StateID INNER JOIN Currencies C ON O.Currency = C.Abb 
WHERE O.OrderDate >= '2009-10-01 00:00:00' AND O.OrderDate < '2010-04-19 23:59:59' 
GROUP BY MonthYear ORDER BY MonthYear 

的目標是讓它返回幾個月零值在沒有銷售。任何人都可以看到缺少什麼?

謝謝你在前進,

奧維

+2

由於數據中不存在日期,因此需要構造日期值列表,並且如果沒有銷售,則該字段爲空或零,則需要構建一個日期值列表,並且將該ORDERS表添加到該列表中... – 2010-04-19 19:31:31

+0

? – 2010-04-19 19:34:32

+0

如果我正確地讀了你,這裏是一個最近類似的問題http://stackoverflow.com/questions/2651249/wanted-to-get-all-dates-in-mysql-result – Unreason 2010-04-19 19:45:22

回答

1

雖然不是不可能的,這是不容易做到這一點的SQL。

因爲它主要是一個演示文稿問題,所以在通過遍歷結果和檢查缺失的月份來執行查詢之後,在客戶端添加缺失的行可能會更容易。

+0

我最終這樣做了PHP。試圖在SQL中執行它會使原來的查詢複雜度超出我能夠處理的範圍。 – user320691 2010-06-01 18:04:39

0

由於您使用的是mysql,因此如果某些用戶沒有訂單,會有幾個月沒有純粹的SQL解決方案。

基本上,對於純sql(在mysql和其他不支持遞歸查詢的RDBMS中)需要的最小值是一個臨時表,每個月都有一個整數序列。

構建這樣的表格可以作爲月度報告的常規部分來完成,因此它不是人爲的要求 - 同時您可以跟蹤與此數據相關的一些其他信息(例如,您可以定義您的財務月開始和結束,或者你可以跟蹤匯率等)。

另一方面,如果你真的,真的想要純SQL看看這個answer - 這是一個黑客,你會受限於最大日期範圍和表現不恆星,但這是最好的我爲mysql找到。

+0

感謝您的建議。 – user320691 2010-06-01 18:51:18