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

标签 sql tsql group-by

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

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/

相关文章:

c# - 如何在 C# Asp.net 中将 SELECT sql 查询结果保存在数组中

sql - 从存储引擎得到错误-1

sql - 在 SQL Server 中归档大量旧数据

sql-server - SQL 返回特定年份以来的年份列表

mysql - 团体串联记录

r - 如何使用group_by()和summary()来统计数据点的出现次数?

sql - postgresql 表中的重复值

sql - 尝试多个 SELECT 直到结果可用的方法?

sql - TSQL 连接查询

c# - 嵌套 Linq 分组依据