2015-02-23 92 views
2

我已经搜索,但没有找到任何适合我的东西。我有3张桌子。一个是客户机Id名称查找,一个支付表和一个invloice表。每位客户都有一张或多张发票记录,其中有欠款。客户在支付表中有0个或更多记录。付款可能用于多张发票,也可能有多张付款用于一张发票。我想得到每个客户的欠款总额。例如,为每个客户添加所有发票并减去每个客户的所有付款。Mysql减去发票付款

Invoices    Payments     Clients 
-------------------- ------------------  ----------- 
|Id|ClientId|Amount| |Id|ClientId|Paid|  |Id| Name | 
|1 | 3 | 200 | | 1| 2  | 10 |  | 1| Bob | 
|2 | 2 | 10 | | 2| 1  | 20 |  | 2| Tom | 
|3 | 4 | 100 | | 3| 2  | 100|  | 3| John | 
|4 | 2 | 240 | | 4| 3  | 240|  | 4| Peter | 
| 5| 1 | 20 | ------------------  -------------- 
-------------------- 

Expected Result 
---------------------- 
|Name |Spent|Paid|Total| 
|John | 200 | 240| -40| 
| Tom | 250 | 110| 140 | 
|Peter| 100 | 0| 100 | 
| Bob | 20 | 20| 0 | 
------------------------ 
+0

这是一个暗示:从发票组'选择(选择总和(金额)通过clientid)作为“花费”,(从支付组中选择总额(金额),作为“支付”等) – ITroubs 2015-02-23 11:12:37

回答

2

考虑以下几点:

DROP TABLE IF EXISTS invoices; 

CREATE TABLE invoices 
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
,client_id INT NOT NULL 
,amount DECIMAL(5,2) NOT NULL 
); 

INSERT INTO invoices VALUES 
(1,3,200), 
(2,2, 10), 
(3,4,100), 
(4,2,240), 
(5,1, 20); 

DROP TABLE IF EXISTS payments; 

CREATE TABLE payments 
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
,client_id INT NOT NULL 
,paid DECIMAL(5,2) 
); 

INSERT INTO payments VALUES 
(1,2,10), 
(2,1,20), 
(3,2,100), 
(4,3,240); 

DROP TABLE IF EXISTS clients; 

CREATE TABLE clients 
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
,name VARCHAR(12) NOT NULL 
); 

INSERT INTO clients VALUES 
(1,'Bob'), 
(2,'Tom'), 
(3,'John'), 
(4,'Peter'); 

SELECT c.name 
    , SUM(CASE WHEN x.type = 'invoice' THEN x.amount ELSE 0 END) spent 
    , SUM(CASE WHEN x.type = 'payment' THEN x.amount ELSE 0 END) paid 
    , SUM(CASE WHEN x.type = 'invoice' THEN x.amount ELSE x.amount * -1 END) total 
    FROM clients c 
    JOIN 
    (SELECT client_id 
      , 'invoice' type 
      , amount 
     FROM invoices 
     UNION 
     SELECT client_id 
      , 'payment' 
      , paid 
     FROM payments 
    ) x 
    ON x.client_id = c.id 
GROUP 
    BY c.id; 

+-------+--------+--------+--------+ 
| name | spent | paid | total | 
+-------+--------+--------+--------+ 
| Bob | 20.00 | 20.00 | 0.00 | 
| Tom | 250.00 | 110.00 | 140.00 | 
| John | 200.00 | 240.00 | -40.00 | 
| Peter | 100.00 | 0.00 | 100.00 | 
+-------+--------+--------+--------+ 

要看到这是如何工作的,请尝试执行刚子查询位SELECT client_id... FROM payments

+0

当我在我的表上使用select时,结果不正确。一个客户有3笔支付记录,共计7000个发票和3个记录在发票中,总计7000个发票中有21000个结果,付款21000个结果 – Dave 2015-02-23 11:48:23

+0

做出更改 - 仍然与更改前完全相同。 – Dave 2015-02-23 12:00:29

+0

*应该*现在就可以了! – Strawberry 2015-02-23 12:19:50