2017-05-25 20 views
0

我有一个连接问题和SUM()Mysql:SUM加入表值

我有两个表,agents(id, name)orders(id, agent_id, total)

现在,我需要一个所有代理商的列表,统计他们放置了多少个订单和所有订单的总数。这里是我的基本查询:

SELECT 
    agents.*, 
    COUNT(DISTINCT orders.id) total_orders, 
    SUM(orders.total) total_amount 
FROM agents 
LEFT JOIN orders ON agents.id = orders.agent_id 
GROUP BY agents.id 

total_orders是正确的,但total_amount不是。每个代理商都有错误的SUM()甚至没有订购任何东西的人都有价值。

在一个查询中可以吗?我不想在循环中再次查询。

+0

如果订单表上的order.id' id pk不需要'DISTINCT orders.id'。 –

+0

你能告诉我们一些样本数据和预期的输出。我没有看到如何查询给你错误的总和。 –

回答

1

你不需要左连接,更换LEFT JOIN通过JOIN

SELECT 
    agents.*, 
    COUNT(DISTINCT orders.id) total_orders, 
    SUM(orders.total) total_amount 
FROM agents 
JOIN orders ON agents.id = orders.agent_id 
GROUP BY agents.id 

你得到的是由这样一个事实:左加入将从订单检索行导致错误的结果表,即使没有记录的agent_id等于agents.id

另一方面,单个连接将不会检索没有订单的代理。

噢,那么你需要所有的代理商,并且希望没有订单的人总数为0 ......那么左边的连接应该可以工作。否则,您可以这样做:

SELECT 
    agents.*, 
    COUNT(DISTINCT orders.id) total_orders, 
    SUM(CASE WHEN orders.id IS NULL then 0 ELSE orders.total END) total_amount 
FROM agents 
LEFT JOIN orders ON agents.id = orders.agent_id 
GROUP BY agents.id 
+0

谢谢,这解决了另一半的问题,但现在没有任何订单的代理商不再出现。 –

+0

你不需要'CASE' SUM忽略空值 –

+0

这很奇怪,因为这就像我原来的查询。说实话,我在这个查询中还有其他连接,经过一番尝试后,又出现了一个LEFT JOIN,这个连接搞砸了我的结果。 –