[英]List users with their financial balances according from product and payment tables
我有一个用户表:
USER表
╔════╦══════╗
║ ID ║ NAME ║
╠════╬══════╣
║ 1 ║ A ║
║ 2 ║ B ║
║ 3 ║ C ║
╚════╩══════╝
付款表
╔════╦═════════╦════════╗
║ ID ║ USER_ID ║ AMOUNT ║
╠════╬═════════╬════════╣
║ 1 ║ 1 ║ 2000 ║
║ 2 ║ 1 ║ 1000 ║
║ 3 ║ 1 ║ 1000 ║
║ 4 ║ 2 ║ 1000 ║
╚════╩═════════╩════════╝
产品表
╔════╦═════════╦════════╗
║ ID ║ USER_ID ║ AMOUNT ║
╠════╬═════════╬════════╣
║ 1 ║ 1 ║ 1000 ║
║ 2 ║ 1 ║ 1000 ║
║ 3 ║ 1 ║ 1000 ║
║ 4 ║ 2 ║ 500 ║
║ 5 ║ 2 ║ 500 ║
║ 6 ║ 3 ║ 1000 ║
╚════╩═════════╩════════╝
现在我想得到这样的结果:
╔════╦══════╦═════════════════╗
║ ID ║ NAME ║ BALANCE ║
╠════╬══════╬═════════════════╣
║ 1 ║ A ║ +1000 (or 1000) ║
║ 2 ║ B ║ 0 ║
║ 3 ║ C ║ -1000 ║
╚════╩══════╩═════════════════╝
您不能直接联接表,因为表users
上的记录在另一个表上具有多个匹配项,而有些则没有,导致无效结果。 我能想到的最好的方法是计算不同表上每个用户的总和,并将结果合并到表user
。
SELECT a.*,
COALESCE(b.totalPayed,0) - COALESCE(c.total,0) balance
FROM user a
LEFT JOIN
(
SELECT user_ID, SUM(amount) totalPayed
FROM payment
GROUP BY user_ID
) b ON a.ID = b.user_ID
LEFT JOIN
(
SELECT user_ID, SUM(amount) total
FROM product
GROUP BY user_ID
) c ON a.ID = c.user_ID
OUTPUT
╔════╦══════╦═════════╗
║ ID ║ NAME ║ BALANCE ║
╠════╬══════╬═════════╣
║ 1 ║ A ║ 1000 ║
║ 2 ║ B ║ 0 ║
║ 3 ║ C ║ -1000 ║
╚════╩══════╩═════════╝
要进一步获得有关联接的知识,请访问以下链接:
DROP TABLE IF EXISTS user;
CREATE TABLE user
(user_id INT NOT NULL PRIMARY KEY,name CHAR(1) NOT NULL);
INSERT INTO user VALUES (1 ,'A'),(2,'B'),(3,'C');
DROP TABLE IF EXISTS payment;
CREATE TABLE payment
(payment_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,user_id INT NOT NULL
,amount INT NOT NULL
);
INSERT INTO payment VALUES
(1 ,1 ,2000),
(2 ,1 ,1000),
(3 ,1 ,1000),
(4 ,2 ,1000 );
DROP TABLE IF EXISTS product;
CREATE TABLE product
(product_id INT NOT NULL PRIMARY KEY
,user_id INT NOT NULL
,amount INT NOT NULL
);
INSERT INTO product VALUES
(1 ,1 ,1000 ),
(2,1 ,1000 ),
(3,1 ,1000),
(4,2 ,500 ),
(5,2 ,500 ),
(6,3 ,1000);
SELECT x.*
, SUM(y.amount) ttl
FROM user x
JOIN
( SELECT user_id
, amount
FROM payment
UNION ALL
SELECT user_id
, amount*-1
FROM product
) y
ON y.user_id = x.user_id
GROUP
BY user_id;
+---------+------+-------+
| user_id | name | ttl |
+---------+------+-------+
| 1 | A | 1000 |
| 2 | B | 0 |
| 3 | C | -1000 |
+---------+------+-------+
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.