2013-06-04 124 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