gpt4 book ai didi

sql - 如何对 GROUP BY 中的多个条件的列求和

转载 作者:行者123 更新时间:2023-12-03 21:17:23 24 4
gpt4 key购买 nike

我正在尝试返回包含余额、结果和收入的帐户列表

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.BANK_NAME, a.LOCALE, a.[STATUS]

更新

根据下面的评论更正了 t2 左连接语法。

希望从问题中可以明显看出我期望的输出。对于 6 个帐户,SQL 应返回 6 个帐户以及该帐户的余额、收入和结果。

我提供的 SQL 的问题是数字错误!根据评论,我认为问题源于多次加入,这对金额的总和不正确。

最佳答案

因为你没有告诉我们what's going wrong (也就是说,除了描述您期望的行为之外,还描述您获得的行为),很难说在哪里,但有几种可能性。尼尔指出了一个。另一个原因是,由于您在事务表上加入了 3 次,因此您将事务与事务配对并获得重复。相反,在事务表上加入一次并更改您总结 Amount 的方式。柱子。

Select
a.ACCOUNT_ID,
a.BANK_NAME,
a.LOCALE,
a.STATUS,
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.BANK_NAME, a.LOCALE, a.[STATUS]

您可以使用 CASE表达式作为乘法的更易读的替代方案:
Select
a.ACCOUNT_ID,
a.BANK_NAME,
a.LOCALE,
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.BANK_NAME, a.LOCALE, a.[STATUS]

关于sql - 如何对 GROUP BY 中的多个条件的列求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2753255/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com