如何将多个子查询与 sum 和 group by 集成

How to integrate multiples sub querys with a sum and group by's

我需要用自己的 "where and group by" 限定词来显示用户信息和多项金额,这些限定词指的是用户的交易余额。 我需要显示实际余额、奖金余额和总余额。 一笔很简单,但我做不了多笔。

这是我对 'real balance' 的查询:

 SELECT v2_user.id, v2_user.username, v2_user.first_name,
 v2_user.last_name,     coalesce(SUM(v2_wallet.amount),0) AS 'Real balance' 
 from v2_wallet
 join v2_user
 on v2_wallet.user_id = v2_user.id
 WHERE TYPE NOT LIKE '%BONUS%'
 group by v2_wallet.user_id

我想在我的查询中再添加 2 列:

SELECT COALESCE(SUM(v2_wallet.amount),0) AS 'bonus balance' from 
v2_wallet          
WHERE TYPE LIKE '%BONUS%' group by user_id

SELECT COALESCE(SUM(v2_wallet.amount),0) AS 'total balance' from v2_wallet group by user_id

根据布尔值计算为 0 或 1 的事实,将条件嵌入 SUM 而不是 WHERE 子句中。

SELECT v2_user.id, v2_user.username, v2_user.first_name, v2_user.last_name,        
SUM(v2_wallet.amount*(TYPE not like '%BONUS%')) AS 'Real balance',
SUM(v2_wallet.amount*(TYPE like '%BONUS%')) AS 'Bonus balance',
SUM(v2_wallet.amount) AS 'Total balance'
from v2_wallet
join v2_user
on v2_wallet.user_id = v2_user.id
group by v2_wallet.user_id

如果v2_wallet.amount可能为NULL,则需要使用上面的COALESCE(v2_wallet.amount,0)

如果你不喜欢它的样子,你可以使用 IF 而不是乘法,比如

SELECT v2_user.id, v2_user.username, v2_user.first_name, v2_user.last_name,        
SUM(IF(TYPE not like '%BONUS%',v2_wallet.amount*,0)) AS 'Real balance',
SUM(IF(TYPE like '%BONUS%', v2_wallet.amount, 0)) AS 'Bonus balance',
SUM(v2_wallet.amount) AS 'Total balance'
from v2_wallet
join v2_user
on v2_wallet.user_id = v2_user.id
group by v2_wallet.user_id

我有一段时间没做 MySql 了。但通常这段代码应该是这样。这是使用 SQL 服务器 sql 语法测试的。

SELECT U.UserID,U.FirstName,T.TOTAL,B.BONUS 
FROM Users U 
LEFT JOIN (SELECT USERID, COALESCE (SUM(AMOUNT),0) AS TOTAL
            FROM WALLET
            GROUP BY USERID) AS T ON U.UserID=T.UserId
LEFT JOIN ( SELECT USERID, COALESCE (SUM(AMOUNT),0) AS BONUS
            FROM WALLET
            WHERE TYPE='BONUS'
            GROUP BY USERID) AS B ON U.USERID=B.USERID