我正在尝试快速进行会计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
答案 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的猜测,但它应该让你走上正确的道路。