加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql – 如何在一个GROUP BY的多个条件下的SUM列

发布时间:2020-12-12 16:47:54 所属栏目:MsSql教程 来源:网络整理
导读:我试图用余额,结果和收入返回账目清单 Account Transaction------- -----------AccountID TransactionIDBankName AccountIDLocale AmountStatus 这是我目前拥有的.有人可以解释我在哪里错了吗? select a.ACCOUNT_ID,a.BANK_NAME,a.LOCALE,a.STATUS,sum(t1.AM
我试图用余额,结果和收入返回账目清单
Account            Transaction
-------            -----------
AccountID          TransactionID
BankName           AccountID
Locale             Amount
Status

这是我目前拥有的.有人可以解释我在哪里错了吗?

select
    a.ACCOUNT_ID,a.BANK_NAME,a.LOCALE,a.STATUS,sum(t1.AMOUNT) as BALANCE,sum(t2.AMOUNT) as OUTCOME,sum(t3.AMOUNT) as INCOME
from ACCOUNT a
left join TRANSACTION t1 on t1.ACCOUNT_ID = a.ACCOUNT_ID
left join TRANSACTION t2 on t2.ACCOUNT_ID = a.ACCOUNT_ID and t2.AMOUNT < 0
left join TRANSACTION t3 on t3.ACCOUNT_ID = a.ACCOUNT_ID and t3.AMOUNT > 0
group by a.ACCOUNT_ID,a.[STATUS]

UPDATE

根据下面的注释修改了t2左连接语法.

我期望的输出从这个问题是有希望的显而易见的.对于6个帐户,SQL应该返回6个帐户,其余额,收入和结果.

我提供的SQL的问题是数字是错误的!根据意见,我认为这个问题源于多次加入,这是不正确的总和.

解决方法

既然你没有告诉我们 what’s going wrong(也就是描述除了描述你所期望的行为之外你所得到的行为),很难说出哪里,但有几种可能性.尼尔指出一个.另一个原因是,由于您在交易表中加入了三次,因此您将交易与交易配对并获得重复.而是单次加入事务表,并更改如何总结Amount列.
Select
    a.ACCOUNT_ID,sum(t.AMOUNT) as BALANCE,sum((t.AMOUNT < 0) * t.AMOUNT) As OUTGOING,sum((t.AMOUNT > 0) * t.AMOUNT) As INCOMING
From ACCOUNT a
Left Join TRANSACTION t On t.ACCOUNT_ID = a.ACCOUNT_ID
Group By a.ACCOUNT_ID,a.[STATUS]

您可以使用CASE表达式作为乘法的更可读的替代方法:

Select
    a.ACCOUNT_ID,a.[STATUS],sum(t.AMOUNT) As BALANCE,sum(CASE WHEN t.AMOUNT < 0 THEN t.AMOUNT ELSE 0 end) As OUTCOME,sum(CASE WHEN t.AMOUNT > 0 THEN t.AMOUNT ELSE 0 end) As INCOME
From ACCOUNT a
Left Join [TRANSACTION] t On t.ACCOUNT_ID = a.ACCOUNT_ID
Group By a.ACCOUNT_ID,a.[STATUS]

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读