【问题标题】:Comparing users balances against the sum of their transactions [duplicate]将用户余额与其交易总和进行比较[重复]
【发布时间】:2016-10-03 12:48:27
【问题描述】:

我有两张桌子:

(i) 显示每个用户的余额的余额表

(ii) 一个交易表,其中包含每个用户的借记和贷记交易

我需要检查是否有任何用户的余额表中的余额与他/她在交易表中的交易总和之间存在差异。

当我输入以下查询时:

select sum(transaction.credit)-sum(transaction.debit),balance.balance
from transaction
right join balance on balance.user_id = transaction.user_id
where balance.balance <> sum(transaction.credit)-sum(transaction.debit)
group by transaction.user_id

我收到一条错误消息“组功能使用无效”。但即使我删除了最后一行,我仍然会收到相同的消息。

我做错了什么?

【问题讨论】:

  • 第二点是这个查询绝对没用,它不能帮助你识别不符点。它的输出将是数字,但您无法确定这些数字实际上来自哪些行
  • @e4c5 错误本身被引发,因为 OP 在 where 子句中使用聚合函数。
  • 哎呀@shadow,我的意思是输入投影而不是项目:)

标签: mysql group-by


【解决方案1】:

使用Having 代替Where 子句

select transaction.user_id
from transaction
right join balance on balance.user_id = transaction.user_id
group by transaction.user_id
Having sum(transaction.credit)-sum(transaction.debit) <> balance.balance

【讨论】:

  • 感谢 JaydipJ。但是,我收到一个错误“'有子句'中的未知列'balance.balance'”。
【解决方案2】:

聚合函数的条件不应放在where 子句中,而应放在having 子句中:

select      balance.user_id, 
            coalesce(sum(transaction.credit), 0) 
             - coalesce(sum(transaction.debit), 0) trans_balance, 
            balance.balance
from        transaction
right join  balance 
         on balance.user_id = transaction.user_id
group by    balance.user_id
having      balance.balance <> trans_balance

请注意,最好使用group by balance.user_id,因为可能没有匹配的transaction 记录。在这种情况下,您还应该使用coalesce,否则null 上的比较将失败。

【讨论】:

  • 谢谢 trincot。它就像一个魅力!
猜你喜欢
  • 2015-11-09
  • 1970-01-01
  • 2019-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-21
  • 1970-01-01
相关资源
最近更新 更多