Mysql SQL使用子句汇总数据
例如,我有两个表: 使用者 付款Mysql SQL使用子句汇总数据,mysql,sql,Mysql,Sql,例如,我有两个表: 使用者 付款 +---------+--------+------+ | user_id | amount | case | +---------+--------+------+ | 0 | 10 | 1 | | 0 | 1 | 2 | | 2 | 5 | 1 | | 2 | 4 | 1 | | 2 | 5 | 2 | | 3
+---------+--------+------+
| user_id | amount | case |
+---------+--------+------+
| 0 | 10 | 1 |
| 0 | 1 | 2 |
| 2 | 5 | 1 |
| 2 | 4 | 1 |
| 2 | 5 | 2 |
| 3 | 26 | 2 |
+---------+--------+------+
我试图得到输出:
+---------+---------------------+---------------------+
| user_id | total_amount_case_1 | total_amount_case_2 |
+---------+---------------------+---------------------+
| 0 | 10 | 1 |
| 2 | 9 | 5 |
| 3 | 0 | 26 |
+---------+---------------------+---------------------+
用文字解释我试图选择每个至少有一笔付款的用户,并在不同的情况下对其付款金额进行合计
我可以选择每个用户的总付款,但不取决于具体情况:
SELECT users.id AS user_id, SUM(payments.amount) AS total_amount FROM users LEFT JOIN users.id = payments.user_id GROUP BY user_id ORDER BY user_id;
这给了我这个输出:
+---------+--------------+
| user_id | total_amount |
+---------+--------------+
| 0 | 11 |
| 1 | 0 |
| 2 | 14 |
| 3 | 26 |
+---------+--------------+
您可以通过条件聚合实现这一点——在聚合函数中使用
case
语句:
SELECT u.id AS user_id,
SUM(case when p.`case` = 1 then p.amount else 0 end) AS total_amount_case1,
SUM(case when p.`case` = 2 then p.amount else 0 end) AS total_amount_case2
FROM users u LEFT JOIN
payments p
on u.id = p.user_id
GROUP BY user_id
ORDER BY user_id;
我还添加了表别名,以减少查询的麻烦。试试这个
SELECT
u.id AS user_id,
SUM(CASE WHEN p.`case` = 1 THEN p.amount ELSE 0 END) AS total_amount_case_1,
SUM(CASE WHEN p.`case` = 2 THEN p.amount ELSE 0 END) AS total_amount_case_2
FROM
users u
LEFT JOIN payments p ON u.id = p.user_id
GROUP BY u.user_id
ORDER BY u.user_id ;
我会做以下几点:
SELECT users.id
,SUM(CASE WHEN payments.[case] = 1 THEN total_amount_case_1 ELSE 0 END) as total_amount_case_1
,SUM(CASE WHEN payments.[case] = 2 THEN total_amount_case_2 ELSE 0 END) as total_amount_case_2
FROM users INNER JOIN payments
ON users.id = payments.user_id
GROUP BY payments.user_id
SELECT users.id AS user_id,
SUM(case when Payments.Case = 1 then payments.amount else 0 End) AS total_amount_case1,
SUM(case when Payments.Case = 2 then payments.amount else 0 End) AS total_amount_case2
FROM users LEFT JOIN payments on
users.id = payments.user_id
GROUP BY users.id
ORDER BY users.id;
SELECT users.id As user_id
, Sum(CASE WHEN payments.case = 1 THEN payments.amount ELSE 0 END) As total_amount_case_1
, Sum(CASE WHEN payments.case = 2 THEN payments.amount ELSE 0 END) As total_amount_case_2
FROM users
LEFT
JOIN payments
ON users.id = payments.user_id
GROUP
BY user_id
ORDER
BY user_id;
SELECT users.id
,SUM(CASE WHEN payments.[case] = 1 THEN total_amount_case_1 ELSE 0 END) as total_amount_case_1
,SUM(CASE WHEN payments.[case] = 2 THEN total_amount_case_2 ELSE 0 END) as total_amount_case_2
FROM users INNER JOIN payments
ON users.id = payments.user_id
GROUP BY payments.user_id