【问题标题】:How to select mysql SUM from multiple tables and other columns from another table?如何从多个表中选择 mysql SUM 并从另一个表中选择其他列?
【发布时间】:2016-10-20 12:47:07
【问题描述】:

我有三张表:cash、cheque 和 bill。所有三个表共享两个公共列:billId 和 customerId。

账单表

+--------+------------+---------+------------+
| billId | date       | bAmount | customerId |
+--------+------------+---------+------------+
| #1     | 01-05-2016 | 120.00  | 2          |
+--------+------------+---------+------------+
| #2     | 10-05-2016 | 100.00  | 2          |
+--------+------------+---------+------------+
| #3     | 20-05-2016 | 80.00   | 2          |
+--------+------------+---------+------------+
| #4     | 20-05-2016 | 70.00   | 2          |
+--------+------------+---------+------------+
| #5     | 27-05-2016 | 50.00   | 2          |
+--------+------------+---------+------------+
| #6     | 28-05-2016 | 20.00   | 2          |
+--------+------------+---------+------------+

支票表

+----------+--------+------------+----------+
| chequeId | billId | customerId | chAmount |
+----------+--------+------------+----------+
| 1        | #1     | 2          | 50.00    |
+----------+--------+------------+----------+
| 2        | #2     | 2          | 25.00    |
+----------+--------+------------+----------+
| 3        | #5     | 2          | 36.00    |
+----------+--------+------------+----------+
| 4        | #4     | 2          | 23.00    |
+----------+--------+------------+----------+

现金表

+--------+--------+------------+----------+
| cashId | billId | customerId | caAmount |
+--------+--------+------------+----------+
| 1      | #1     | 2          | 55.00    |
+--------+--------+------------+----------+
| 2      | #2     | 2          | 70.00    |
+--------+--------+------------+----------+
| 3      | #3     | 2          | 69.00    |
+--------+--------+------------+----------+
| 4      | #4     | 2          | 23.00    |
+--------+--------+------------+----------+

我必须生成查询以生成如下结果:

+--------+------------+--------+---------+
| billId | date       | amount | pending |
+--------+------------+--------+---------+
| #1     | 01-05-2016 | 120.00 | 15.00   |
+--------+------------+--------+---------+
| #2     | 10-05-2016 | 100.00 | 05.00   |
+--------+------------+--------+---------+
| #3     | 20-05-2016 | 80.00  | 11.00   |
+--------+------------+--------+---------+
| #4     | 20-05-2016 | 70.00  | 14.00   |
+--------+------------+--------+---------+
| #5     | 27-05-2016 | 50.00  | 04.00   |
+--------+------------+--------+---------+

我正在将 customerID 的值从另一个页面发送到此页面,例如 $customerId = $_REQUEST['customerId'],我必须从中选择 BillId 和 Date 来自账单表,amount(由 chAmount+caAmount 的总和计算)和 pending(由 bAmount-(chAmount+caAmount) 的差计算)。由于 billId #6 在 cheque 和 cash 表中没有任何记录,因此不需要在结果中生成。请提及一个正确的 MySql 查询并解释它。

【问题讨论】:

    标签: php mysql sum


    【解决方案1】:

    通常情况下,您应该尝试一些东西,但在我的“好日子”中,我编写了完整的 SQL 语句:

    SELECT b.billId, b.bDate, b.bAmount, SUM(ch.chAmount) chAmountSum, SUM(ca.caAmount) caAmountSum, (b.bAmount - ( IFNULL(SUM(ch.chAmount), 0)  + IFNULL(SUM(ca.caAmount), 0))) pending
    FROM bill b
    LEFT JOIN  cheque ch on ch.billId = b.billId
    LEFT JOIN  cash ca on ca.billID = b.billId
    GROUP BY b.billID;
    
    • 您必须选择要显示的所有列
    • 对于最后一个(待处理),进行操作(金额 - (支票 + 现金)),如果它是空值,则使用 IFNULL SQL 函数将其替换为“0”
    • 使用 LEFT JOIN,因为即使还没有相关的付款(支票/现金),您也需要所有账单
    • 您的参考列中的 GROUP BY:billID

    【讨论】:

    • 我尝试了大约 4 个小时,最后你给了我一个很好的解决方案,非常感谢。你在哪里学习 SQL? ;)
    • 我还需要 WHERE='customerId' 吗?
    • 我在学校学过,我很喜欢;)!是的,如果您想按特定客户进行过滤,只需添加 WHERE 子句。但是,如果您想要一个全局结果(针对您的所有客户),则不需要它,因为表已经通过唯一的 billId 链接,并且账单仅链接到一个客户。
    猜你喜欢
    • 1970-01-01
    • 2016-07-22
    • 1970-01-01
    • 1970-01-01
    • 2011-03-30
    • 2018-09-27
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多