如何将多个子查询与 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
我需要用自己的 "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