1

我正在尝试做一个快速的会计 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
4

1 回答 1

2

首先,您应该使用别名,以便我们知道所有字段的来源。我猜这payment_amount来自paymentstable 而不是来自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 的猜测,但它应该让您走上正确的道路。

于 2013-04-02T18:00:29.837 回答