MySQL高级子查询重复

MySQL高级子查询重复,mysql,subquery,Mysql,Subquery,我正在为我正在开发的应用程序编写一些相当复杂的报告查询。我可能可以通过使用更高级的PHP来实现以下所有功能,但显然我希望使用MySQL来完成所有功能,这将大大简化工作 我需要的报告是一个典型的销售报告类型查询,它将列出一个人员列表,以及一些与他们相关的总计。唯一的细微差别是,该系统与货运/运输有关,因此“销售人员”实际上是货车司机,“销售人员”是个人托运货物。此外,托运货物仅通过创建“路线”与各自的驾驶员相关联/绑定,该路线记录了在特定日期由谁递送/收取货物 当然,我可以使用一个内部连接来获得每

我正在为我正在开发的应用程序编写一些相当复杂的报告查询。我可能可以通过使用更高级的PHP来实现以下所有功能,但显然我希望使用MySQL来完成所有功能,这将大大简化工作

我需要的报告是一个典型的销售报告类型查询,它将列出一个人员列表,以及一些与他们相关的总计。唯一的细微差别是,该系统与货运/运输有关,因此“销售人员”实际上是货车司机,“销售人员”是个人托运货物。此外,托运货物仅通过创建“路线”与各自的驾驶员相关联/绑定,该路线记录了在特定日期由谁递送/收取货物

当然,我可以使用一个内部连接来获得每个驱动程序的列表,以及他们交付/收集的所有货物,并计算这些货物的总收入。但是,当我需要同时显示总交付收入收款收入列时,问题就出现了。这些数字可以来自发货表,该表列出了每一批货物。每批货物都可以有一个标志(枚举“D”、“C”),该标志用于捐赠,无论是交付还是收集。通过使用子查询几乎可以很容易地确定这一点,但仍然会有大量重复

到目前为止,我所拥有的:

SELECT pr.driver_callsign, d.first_name, d.last_name, sum(pc.revenue) AS total_revenue
FROM pallet_routes AS pr
INNER JOIN drivers AS d ON d.driver_callsign = pr.driver_callsign
INNER JOIN pallet_consignments AS pc ON pc.route_id = pr.route_id
GROUP BY pr.driver_callsign
ORDER BY d.driver_callsign ASC
这显然会返回每个驱动程序的列表,以及与之相关的所有托运货物的总收入

进一步拆分此
revenue
SUM字段以显示type=“C”处的
SUM(revenue)和type=“D”
处的
SUM(revenue),最有效的方法是什么?子查询?工会

还值得一提的是,结束查询将缩小到一个日期范围。因此,例如,将有一个
其中x和y之间的日期
放在
托盘路径
表上


任何建议都会得到很好的接受。请询问是否需要我详细说明。

我不知道您的列
类型
在哪里,但如果它在
托盘货物上,您可以尝试以下操作:

SELECT pr.driver_callsign, d.first_name, d.last_name, 
SUM(IF(pc.`type` = 'C', pc.revenue, 0)) collection_revenue,
SUM(IF(pc.`type` = 'D', pc.revenue, 0)) delivery_revenue
FROM pallet_routes AS pr
INNER JOIN drivers AS d ON d.driver_callsign = pr.driver_callsign
INNER JOIN pallet_consignments AS pc ON pc.route_id = pr.route_id
GROUP BY pr.driver_callsign
ORDER BY d.driver_callsign ASC

否则,请说明列
类型
的位置。

我不知道您的列
类型
的位置,但如果它位于
货盘托运
上,您可以尝试以下操作:

SELECT pr.driver_callsign, d.first_name, d.last_name, 
SUM(IF(pc.`type` = 'C', pc.revenue, 0)) collection_revenue,
SUM(IF(pc.`type` = 'D', pc.revenue, 0)) delivery_revenue
FROM pallet_routes AS pr
INNER JOIN drivers AS d ON d.driver_callsign = pr.driver_callsign
INNER JOIN pallet_consignments AS pc ON pc.route_id = pr.route_id
GROUP BY pr.driver_callsign
ORDER BY d.driver_callsign ASC

否则,请说明
类型
列的位置。

嘿,谢夫,谢谢你抽出时间。我同意这种方法在理论上是可行的,但是MySQL解释器不喜欢它,并报告:
您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以了解使用第3行“SUM(如果(pc.
type`='D',pc.revenue,0))作为交货收入的正确语法”`@George:上一个SUM上忘记了逗号!尝试更新的查询。谢夫,谢谢回复!更新后的查询非常有效,非常感谢!我甚至没有想到我可以用这样的IF来实现这些结果@乔治:不客气!这就是为什么学习是我们字典的一部分!:)这个查询在任何其他类型上都会做得很好,您可以添加where或任何其他您喜欢的子句。我同意这种方法在理论上是可行的,但是MySQL解释器不喜欢它,并报告:
您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以了解使用第3行“SUM(如果(pc.
type`='D',pc.revenue,0))作为交货收入的正确语法”`@George:上一个SUM上忘记了逗号!尝试更新的查询。谢夫,谢谢回复!更新后的查询非常有效,非常感谢!我甚至没有想到我可以用这样的IF来实现这些结果@乔治:不客气!这就是为什么学习是我们字典的一部分!:)这个查询在任何其他类型上都会做得很好,您可以添加where或任何其他您喜欢的子句。