【问题标题】:MySQL advanced sub query repetitionMySQL高级子查询重复
【发布时间】:2011-07-12 11:45:46
【问题描述】:

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

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

当然,我可以使用 INNER JOIN 来获取每个司机的列表,包括他们交付/收集的所有货物,并对这些货物的收入进行求和。但是,当我需要同时显示总交付收入收款收入列时,问题就来了。这些数字可以来自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" 的最有效方法是什么?子查询?联合?

还值得一提的是,结束查询将缩小到一个日期范围。因此,例如将有一个 WHERE date BETWEEN x AND y 放在 pallet_routes 表上。

我们将不胜接受任何建议。如果您希望我详细说明,请询问。

【问题讨论】:

    标签: mysql subquery


    【解决方案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 列在哪里。

    【讨论】:

    • 嘿 Shef 感谢您抽出宝贵时间。我同意,这样的事情在理论上可行,但 MySQL 解释器不喜欢它并报告:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SUM(IF(pc.type` = 'D', pc.revenue, 0)) as delivery_revenue FROM palette_routes ' at line 3`
    • @George:在前面的 SUM 中忘记了逗号!尝试更新后的查询。
    • 谢夫,感谢您的回复!更新后的查询完美运行,非常感谢!我什至没有想到我可以使用这样的 IF 来实现这些结果!
    • @George:不客气!这就是为什么学习是我们词典的一部分! :) 这个查询将比任何其他类型做得更好,您可以添加一个 where 或您喜欢的任何其他子句。
    猜你喜欢
    • 2019-09-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    • 2022-01-20
    相关资源
    最近更新 更多