【问题标题】:I need help creating a SQL query我需要帮助创建 SQL 查询
【发布时间】:2012-12-10 14:50:29
【问题描述】:

我需要编写一个类似这样的报告:

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

我打算解决的方法是:

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

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

[编辑]

代理表: ID, 姓名, 期初余额

销售表: ID, agent_id, 数量, 客户ID, 销售日期

付款表: ID, agent_id, 数量, 银行ID, 付款日期, 状态

[第二次编辑]

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

[第三次编辑]

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

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

【问题讨论】:

  • 这些都是通过“代理”连接的,如果您提供表详细信息(列名),我可以帮助您编写一个查询来加入这些。
  • 请张贴表格的结构。你需要的是一个 JOIN 和一个 GROUP BY 的聚合函数,那么这将是累积总数的问题。
  • 你能发布更多关于代理表的详细信息吗?

标签: php mysql sql


【解决方案1】:

这是第一次剪辑

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

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

【讨论】:

    猜你喜欢
    • 2021-06-29
    • 1970-01-01
    • 2011-04-03
    • 2014-06-20
    • 2011-05-29
    • 1970-01-01
    • 2020-09-08
    • 2016-07-04
    • 2016-07-26
    相关资源
    最近更新 更多