2013-06-04 127 views
1

我有兩張表,客戶和銷售額。我想爲每個客戶計算銷售額,併爲每個商店創建一個每月銷售額表。MySql左加入COUNT

我想生產一些像;

------------------------------ 
month | customers | sales | 
------------------------------ 
1/2013 |  5  | 2 | 
2/2013 |  21  | 9 | 
3/2013 |  14  | 4 | 
4/2013 |  9  | 3 | 

但是我在使用以下方法時無法使銷售計數正確:

SELECT CONCAT(MONTH(c.added), '/', YEAR(c.added)), count(c.id), count(s.id) 
FROM customers c 
LEFT JOIN sales s 
ON s.customer_id = c.id AND MONTH(c.added) = MONTH(s.added) AND YEAR(c.added) = YEAR(s.added) 
WHERE c.store_id = 1 
GROUP BY YEAR(c.added), MONTH(c.added); 

Customers table;

------------------------------- 
id | store_id | added | 
------------------------------- 
1  |  1  |2013-02-01 | 
2  |  1  |2013-02-02 | 
3  |  1  |2013-03-16 | 

銷售表;

--------------------------------- 
id | added | customer_id | 
--------------------------------- 
1  | 2013-02-18 |  3  | 
2  | 2013-03-02 |  2  | 
3  | 2013-03-16 |  3  | 

任何人都可以在這裏幫忙嗎?

感謝

+0

顯示錶模式和兩個表的一些樣本數據。 – hims056

+0

嗨@ hims056,我有一張顧客桌子; [id,added]和銷售表[id,added,customer_id]。客戶表記錄客戶何時添加到系統中,銷售表記錄客戶進行購買的時間 –

+0

是的我可以在您的問題中看到,但顯示模式和一些示例數據。 (和你展示你的預期輸出一樣) – hims056

回答

1

(更新)現有的查詢將只計算在同一個月內已添加客戶提出銷售。試試這個,而是:

SELECT CONCAT(MONTH(sq.added), '/', YEAR(sq.added)) month_year, 
     sum(sq.customer_count), 
     sum(sq.sales_count) 
FROM (select s.added, 0 customer_count, 1 sales_count 
     from customers c 
     JOIN sales s ON s.customer_id = c.id 
     WHERE c.store_id = 1 
     union all 
     select added, 1 customer_count, 0 sales_count 
     from customers 
     WHERE store_id = 1) sq 
GROUP BY YEAR(sq.added), MONTH(sq.added); 
+0

謝謝@Mark,這很棒。你似乎已經找到了我自己的查詢的問題。不幸的是,我不能保證將在客戶被添加的同一個月內進行銷售。是否有可能創建「更復雜」的查詢?謝謝 –

+0

@ChristyHerron:我相應地更新了我的查詢。 –

+0

@ChristyHerron:這應該爲指定商店每月返回新客戶和每月銷售額 - 請注意,sales_count按銷售表添加日期分組。是什麼讓你認爲它返回的結果太多了?您是否嘗試過針對數據庫中的實際記錄檢查特定月份的結果? –

0
SELECT c.* , s.sales_count<br> 
FROM customers c<br> 
LEFT JOIN (SELECT customer_id, count(id) as sales_count FROM sales GROUP BY customer_id) s on c.id=s.customer_id<br> 
WHERE c.store_id = 1<br> 
+0

請在你的回答中包含一個簡要的解釋,說明爲什麼這種方法可行,或者在OP的代碼中不起作用,這樣這個答案可以解決問題。 :) – Manhattan