我需要帮助创建SQL查询

时间:2012-12-10 14:50:29

标签: php mysql sql

我需要提出一份看起来像这样的报告:

enter image description here

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

我打算解决这个问题的方法是:

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

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

[编辑]

代理商表: ID, 名称, opening_balance

销售表: ID, AGENT_ID, 量, 顾客ID, SALE_DATE

付款表 ID, AGENT_ID, 量, bank_id, 付款日期, 状态

[第二编辑]

谢谢Olaf Dietsche。没有子选择的第二个查询需要很长时间才能运行。大约88秒。我也尝试了第一次使用子选择并且它在闪光中完成但是总和(s.amount)和sum(p.amount)保持两倍于它们应该是的值。

enter image description here

[3rd Edit]

代理商可以进行多次销售 代理商可以进行多次付款

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

1 个答案:

答案 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

SQL Fiddle

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

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 Fiddle

两者都未经过测试,因为我没有这样的数据。