1

我需要拿出一个看起来像这样的报告:

在此处输入图像描述

有 3 个表格 Agent、Sales 和 Payments。销售和付款通过代理表链接。该报告将显示每个代理每天的总销售额。它还需要每天显示代理已支付的任何款项,这将从总销售余额中扣除,以便我们可以在任何时间点判断代理是否欠业务,反之亦然。

我计划解决这个问题的方法是:

  • 获取每个代理每天的所有销售额(一次查询)
  • 每天获取每个代理的所有付款(一次查询)
  • 对于每个销售、代理和每天检查(代理每天支付每个代理)(循环)
  • 如果找到匹配项,则获取值并用于累积总计的计算
  • 否则只显示适当的销售数据和累计总数。

我不确定是否有可以让我的生活更轻松的查询。谢谢。

[编辑]

代理表: id、name、opening_balance

销售表: id、agent_id、amount、customer_id、sale_date

付款表: id、agent_id、amount、bank_id、payment_date、status

[第二次编辑]

感谢奥拉夫·迪茨切。没有子选择的第二个查询需要很长时间才能运行。大约 88 秒。我还尝试了第一个子选择,它在一瞬间完成,但是 sum(s.amount) 和 sum(p.amount) 的值是应有的两倍。

在此处输入图像描述

[第三次编辑]

一个代理可以进行多次销售,一个代理可以进行多次付款

销售和付款之间没有直接联系

4

1 回答 1

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

SQL小提琴

这是一个没有子选择的选择。这可能会更快

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

SQL小提琴

两者都未经测试,因为我没有数据可以这样做。

于 2012-12-10T16:35:46.997 回答