【问题标题】:SQL Join query to return sum and most recent entriesSQL Join 查询返回总和和最近的条目
【发布时间】:2016-08-27 20:11:33
【问题描述】:

我试图在 Laravel 应用程序中组合一个 SQL 查询来创建关于 customersagentsorders 的报告,并且需要一些帮助。

我已经说明了我的数据库表,并从下面的架构中排除了不必要的字段:

客户表

---------------------------------------------
cust_id     cust_name           
---------------------------------------------
1           Joe 
2           Allan
3           Rick
4           Bill        

代理表

每个代理都通过一个 cust_id 外键与客户相关联:

---------------------------------------------
agent_id    agent_name  cust_id 
---------------------------------------------
1           Mike        2
2           Arnold      4
3           Lucy        1
4           Tom         3

订单表

orders 表包含客户下的所有订单(由 cust_id 通过外键引用),包括订单日期和金额:

-----------------------------------------------
ord_id      cust_id     date        amount  
-----------------------------------------------
1           1           1/1/2001    50.00
2           1           1/1/2001    20.00
3           2           2/1/2001    20.00
4           4           2/1/2001    30.00
5           3           2/1/2001    75.00
6           3           3/1/2001    35.00
7           1           4/1/2001    20.00
8           3           5/1/2001    75.00
9           2           5/1/2001    10.00

期望的查询结果:

我想构建一个查询来检索每个客户的代理名称、最近销售日期、最近销售金额和总销售金额(按客户名称排序):

------------------------------------------------------------------
custName    agentName   LastSaleDate    LastSaleAmt     TotalSales  
------------------------------------------------------------------
Allan       Mike        10.00           5/1/2001        30.00
Bill        Arnold      30.00           2/1/2001        30.00           
Joe         Lucy        20.00           4/1/2001        90.00
Rick        Tom         75.00           5/1/2001        185.00

现状:

到目前为止,我已经创建了所有 laravel 模型并设置了 eloquent 关系,但怀疑上面的查询应该使用常规 SQL 而不是 ORM 来完成。

使用 SQL,我可以检索客户名称、代理名称和总销售额,但不能检索最后销售日期和最后销售额:

SELECT customers.name, agents.name, SUM(orders.amount) FROM customers
LEFT JOIN agents
ON customers.id=agents.cust_id
LEFT JOIN orders
ON customers.id=orders.cust_id
GROUP BY customers.id, agents.name
ORDER BY customers.name ASC

如何扩展此查询以包括最近的销售日期和金额?

感谢任何帮助!

【问题讨论】:

  • 那么每个代理只有一个客户?
  • @Strawberry 是的,没错。

标签: mysql sql laravel join eloquent


【解决方案1】:

这个想法是聚合以获得总数和最后销售日期。然后加入 orders 信息以获取最后的金额:

select oca.name, oca.agentname, oca.sales, oca.lastSaleDate,
       o.amount as lastSaleAmount
from (select c.id, c.name, a.name as agentname, sum(o.amount) as sales,
             max(o.date) as lastSaleDate
      from orders o join
           customers c
           on o.cust_id = c.id join
           agents a
           on c.id = a.cust_id
      group by c.id, c.name, a.name
     ) oca join
     orders o
     on o.cust_id = oca.cust_id and oca.lastSaleDate = o.date

【讨论】:

  • 非常感谢 Gordon - 我会试一试并报告/标记为完成。
  • 完美运行 - 我只需要更好地理解这一点。感谢您花时间回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 2018-03-18
  • 1970-01-01
  • 2018-05-08
  • 2016-09-06
相关资源
最近更新 更多