mysql - 如何使用左连接减去值的总和?

标签 mysql

我有两个表 orderscustomers:

select * from orders;
+------+---------------------+-------------+--------+
| oid  | date                | customer_id | amount |
+------+---------------------+-------------+--------+
|  102 | 2009-10-08 00:00:00 |           4 |    300 |
|  100 | 2009-10-08 00:00:00 |           3 |  15000 |
|  101 | 2008-10-08 00:00:00 |           2 |   1300 |
|  105 | 2010-10-08 00:00:00 |           1 |    400 |
|  106 | 2014-12-23 00:00:00 |           3 |    300 |
+------+---------------------+-------------+--------+

select * from customers;
+------+--------+------+-----------+----------+
| id   | name   | age  | address   | salary   |
+------+--------+------+-----------+----------+
|    1 | ramesh |   32 | Ahmedabad |  2000.00 |
|    2 | khilan |   25 | delhi     |  1500.00 |
|    3 | muffy  |   22 | bhopal    |  8500.00 |
|    4 | suresh |   48 | mumbai    | 24000.00 |
|    1 | ramesh |   32 | Ahmedabad |   300.00 |
|    5 | akil   |   21 | madurai   |  1000.00 |
|    6 | rajesh |   22 | delhi     |  5000.00 |
+------+--------+------+-----------+----------+

我想做的是从 customers 中计算 SUM(salary) 并从中减去 SUM(amount) 订单 表。我试过这个查询:

SELECT id ,NAME,SUM(salary),SUM(amount),SUM(salary)-SUM(amount) 
FROM customers a LEFT JOIN orders b ON a.id=b.customer_id  
GROUP BY NAME;

这将返回以下结果,其中一些返回不正确的值:

+------+--------+-------------+-------------+-------------------------+
| id   | name   | SUM(salary) | SUM(amount) | SUM(salary)-SUM(amount) |
+------+--------+-------------+-------------+-------------------------+
|    5 | akil   |     1000.00 |        NULL |                    NULL |
|    2 | khilan |     1500.00 |        1300 |                  200.00 |
|    3 | muffy  |    17000.00 |       15300 |                 1700.00 |
|    6 | rajesh |     5000.00 |        NULL |                    NULL |
|    1 | ramesh |     2300.00 |         800 |                 1500.00 |
|    4 | suresh |    24000.00 |         300 |                23700.00 |
+------+--------+-------------+-------------+-------------------------+

我的预期输出如下:

+------+--------+-------------+-------------+-------------------------+
| id   | name   | SUM(salary) | SUM(amount) | SUM(salary)-SUM(amount) |
+------+--------+-------------+-------------+-------------------------+
|    5 | akil   |     1000.00 |        NULL |                    1000 |
|    2 | khilan |     1500.00 |        1300 |                  200.00 |
|    3 | muffy  |    8500     |       15300 |                 -6800   |
|    6 | rajesh |     5000.00 |        NULL |                    5000 |
|    1 | ramesh |     2300.00 |         400 |                 1900.00 |
|    4 | suresh |    24000.00 |         300 |                23700.00 |
+------+--------+-------------+-------------+-------------------------+

最佳答案

  1. 一种方法是将订单的计算放入子查询。

  2. 为了满足 NULL 值,您可以使用 IFNULL(value,0)

    SELECT id,NAME,SUM(salary),amt,SUM(salary)-IFNULL(amt,0)
        FROM customers a LEFT JOIN 
            (SELECT customer_id, SUM(amount) amt FROM orders GROUP BY customer_id) b 
        ON a.id=b.customer_id  
    GROUP BY NAME;

关于mysql - 如何使用左连接减去值的总和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56965571/

相关文章:

php:使用参数从另一个 php 文件执行 php 文件

php - 需要方法来查找下一个/上一个记录 ID,而无需循环遍历所有记录

java - SQL语法错误: Reading queries from text file: derby

MySQL 在连接表上强制索引 - 当优化器首先从连接表中选择时

mysql - 如何阻止唯一键上的 NULL 值?

mysql - 在 MySQL 查询浏览器中执行存储过程,但不执行显示异常,如您的 SQL 语法有错误

mysql - Eclipse 在添加 MySql jdbc 驱动程序时出错

mysql - 计数函数 - Codeigniter 和 MySQL

mysql - mysql 节点的 Node-red 负载转换

mysql - 尝试使用同一表中的值更新表