【问题标题】:Aggregate functions return wrong values when joining more tables加入更多表时,聚合函数返回错误值
【发布时间】:2011-03-20 23:57:47
【问题描述】:

我想显示所有客户及其地址以及他们的订单数量和总和。我的查询如下所示:

select *, sum(o.tota), count(o.total) 
from customer c 
natural join orders o
group by c.custId;

效果很好。

但是如果我在查询中添加一个新表:

select *, sum(o.tota), count(o.total) 
from customer c 
natural join orders o
natural join cust_addresses a
group by c.custId;

那么它将不再起作用。聚合函数返回错误值,因为每个客户可能有多个地址,这是正确的,我还想显示他们的所有地址。 如何解决聚合函数问题?

我可以考虑做这样的事情:

select *, (select total from orders o where o.custid=c.custid), ..
from customer c 
natural join orders o
natural join cust_addresses a
group by c.custId;

但这很慢。

编辑 我现在尝试了以下操作,但它告诉我字段 c.custid 是未知的:

select *
from
     customer c,               
     left join (select sum(o.tota), count(o.total) from orders o where o.custid=c.custid) as o
where ...
group by c.custId;

【问题讨论】:

  • 你想如何处理没有订单的客户?您当前的查询忽略了它们。
  • 右年,我忘记了左连接的左边:)

标签: sql sqlite select aggregate-functions


【解决方案1】:

尝试类似:

select c.custId, max(c.custName) custName, ...
       a.addrId, max(a.addrLine1) addrLine1, ...
       sum(o.total) order_total, count(o.total) order_count
from customer c 
left join orders o on c.custId = o.custId
left join cust_addresses a on c.custId = a.custId
group by c.custId, a.addrId;

假设您想要所有客户,无论他们是否有任何订单或地址。

【讨论】:

  • 但是如果客户有多个订单或地址,那么总和和计数将无法正确显示。
  • @codymanix,您是否在查询的 group by 子句中包含了 cust_address 键字段(我称之为 addrId,因为您没有发布表结构)?如果是这样,则应该正确返回总和和计数。
  • 但是我有多行返回一位客户。
  • @codymanix:是的,如果每个客户有多个地址,每个客户的每个地址都会得到一行。您在问题中明确表示您想显示“他们的所有地址”;此查询解决了聚合函数问题显示了它们的所有地址。
【解决方案2】:

简单的解决方案:使用两个查询。

否则,您可以在子查询中进行聚合计算(在整个表上,而不是在每行上),然后将子查询的结果与地址表联接以获取额外数据。试试这个:

SELECT *
FROM customer T1
LEFT JOIN
(
    SELECT custId,
           SUM(total) AS sum_total,
           COUNT(total) AS count_total
    FROM orders
    -- WHERE ...
    GROUP BY custId
) T2
ON T1.custId = T2.custId
-- WHERE ...

【讨论】:

  • 感谢您的回答。我现在尝试了,但它对我不起作用。看来我无法从子选择中访问外部表。请查看我的编辑。
  • @codymanix:您无法从外部查询中的内部查询访问别名。
  • 不,我想在内部查询中访问外部查询的别名。我想在内部查询的 where 子句中使用外部查询中定义的客户 c。
  • @codymanix:你为什么要这么做?如果 custId 是 customer 表的 PK,最后不就是给出同样的结果吗?
  • @codymanix:你的问题不清楚。也许您可以陈述您的全部要求并解释为什么这个答案不符合这些要求。
猜你喜欢
  • 2017-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-03
  • 1970-01-01
  • 2018-02-23
  • 1970-01-01
相关资源
最近更新 更多