我需要提出一份看起来像这样的报告:
代理商,销售和付款共有3个表。销售和付款通过代理商表链接。该报告将显示每个代理每天的每日总销售额。它还需要每天显示代理商已经支付的任何款项,并且这将从总销售余额中扣除,以便我们可以判断代理商是否欠业务的任何时间点,反之亦然。
我打算解决这个问题的方法是:
我不确定是否有查询可以让我的生活更轻松一点。感谢。
[编辑]
代理商表: ID, 名称, opening_balance
销售表: ID, AGENT_ID, 量, 顾客ID, SALE_DATE
付款表 ID, AGENT_ID, 量, bank_id, 付款日期, 状态
[第二编辑]
谢谢Olaf Dietsche。没有子选择的第二个查询需要很长时间才能运行。大约88秒。我也尝试了第一次使用子选择并且它在闪光中完成但是总和(s.amount)和sum(p.amount)保持两倍于它们应该是的值。
[3rd Edit]
代理商可以进行多次销售 代理商可以进行多次付款
销售和付款之间没有直接联系
答案 0 :(得分:0)
这是第一次切割
select a.name, s.sale_date, sum(s.amount), sum(p.amount),
(select sum(amount)
from sales
where agent_id = a.id and sale_date <= s.sale_date) as cum_sales,
(select sum(amount)
from payments
where agent_id = a.id and payment_date <= s.sale_date) as cum_payments
from agents a
join sales s on s.agent_id = a.id
join payments p on p.agent_id = a.id
group by s.agent_id, s.sale_date
order by s.agent_id, s.sale_date
累计余额为opening_balance - cum_sales + cum_payments
。
这是一个没有子选择的选择。 可能更快
select a.name, s.sale_date, sum(s.amount), sum(p.amount),
sum(cs.amount) as cum_sales,
sum(cp.amount) as cum_payments
from agents a
join sales s on s.agent_id = a.id
join payments p on p.agent_id = a.id
join sales cs on cs.agent_id = a.id and cs.sale_date <= s.sale_date
join payments cp on cp.agent_id = a.id and cp.payment_date <= s.sale_date
group by s.agent_id, s.sale_date
order by s.agent_id, s.sale_date
两者都未经过测试,因为我没有这样的数据。