我正在编写一些相当复杂的查询来报告我正在开发的应用。我可以通过使用更高级别的PHP来实现以下所有功能,但显然我想用MySQL完成所有这些操作,这显然会大大简化。
我需要的报告是典型的销售报告类型查询,它将列出人员列表以及与他们相关的一些相关总计。唯一的细微差别是这个系统涉及货运/运输,因此“销售人员”实际上是货车司机,“销售”是个别托运。此外,货物只通过创建“路线”链接/绑定到各自的司机,“路线”记录谁在特定日期交付/收集什么。
当然,我可以使用INNER JOIN来获取每个驱动程序的列表,包括他们已交付/收集的所有货物,以及SUM从中获得的收入。但是,当我需要显示总投放收入和集合收入的列时,问题就出现了。这些数字可以来自 consignments 表,其中列出了每批货物。每批货物都可以有一个标志(ENUM“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字段进一步拆分为显示SUM(revenue) WHERE type = "C"
和SUM(revenue) WHERE type="D"
的最有效方法是什么?子查询? UNION?
值得一提的是,最终查询将缩小到日期范围。例如,对WHERE date BETWEEN x AND y
表格会有pallet_routes
。
任何建议都会得到很好的接受。请问你是否要我详细说明。
答案 0 :(得分:1)
我不知道您的专栏type
在哪里,但如果它在pallet_consignments
上,您可以尝试以下操作:
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
否则,请提及type
列的位置。