嵌套SQL语句未按预期计算SUM

时间:2013-04-02 17:38:47

标签: mysql sql nested sum statements

我正在尝试快速进行会计sql语句,我遇到了一些问题。

我有3个表注册,事件和付款表。注册是个人交易,事件是关于他们注册的信息,支付是对事件的支付。

我想总计注册支付的金额,将事件名称和事件开始日期列入一列,然后总计到目前为止的付款金额。如果可能的话,我也希望找到一个未支付的总额。我相信除了支付金额总额之外,最底层的数字除外。付款金额总计远远超过应有的金额,超过使用SUM的可能性,因为嵌套而多次计算付款。

select 
  sum(`reg_amount`) as total, 
  event_name, 
  event_startdate, 
  (
    select sum(payment_amount) as paid 
    from registrations 
    group by events.event_id
  ) pay
FROM registrations 
  left join events 
    on events.event_id = registrations.event_id
  left join payments 
    on payments.event_id = events.event_id
group by registrations.event_id

1 个答案:

答案 0 :(得分:2)

首先,您应该使用别名,以便我们知道所有字段的来源。我猜测payment_amount来自payments表,而不是来自registrations

如果是这样,您的子查询会在外部表中为注册中的每一行添加付款。可能不是你想要的。

我想你想要这样的东西:

select sum(`reg_amount`) as total, 
       e.event_name, 
       e.event_startdate, 
       p.TotPayements
FROM registrations r left join
     events e
     on e.event_id = r.event_id left join
     (select event_id, sum(payment_amount) as TotPayments
      from payments
      group by event_id
     ) p
     on p.event_id = e.event_id
group by r.event_id;

我们的想法是在尽可能低的水平上汇总付款,以避免因加入而造成的重复。也就是说,在加入之前聚合

这是对正确SQL的猜测,但它应该让你走上正确的道路。