如何使用左联接减去值的总和?

时间:2019-07-10 07:32:59

标签: 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 |
+------+--------+------+-----------+----------+

我想做的是从SUM(salary)customers,然后从SUM(amount)表中把orders减去。我已经尝试过以下查询:

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 个答案:

答案 0 :(得分:0)

  1. 一种方法是在orders上进行计算并进入子查询。

  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;