我在编写SQL查询时遇到困难,该查询会将account_no正确分组并减去金额。
首先我写了这个查询,除了ACCOUNT_NO A-102最终应该更新为4500而不是两个不同的正确余额时,所有内容都会更新。
select transactions.account_no, account.balance, transactions.amount,
(account.balance + transactions.amount) AS "CORRECT BALANCE"
from transactions, account
where account.account_no = transactions.account_no;
ACCOUNT_NO| BALANCE | AMOUNT | CORRECTBALANCE
A-102 | 4000 | 2000 | 6000
A-102 | 4000 | -1500 | 2500
A-222 | 8000 | -1000 | 7000
A-305 | 2000 | 1300 | 3300
我试图通过account_no进行求和并进行分组,但我无法弄清楚如何使用这两个表进行此操作。这只是我尝试但无法开始工作的东西。
select transactions.account_no, SUM(transactions.amount)
from transactions
group by transactions.account_no;
ACCOUNT_NO| SUM(TRANSACTIONS.AMOUNT)
A-305 | 1300
A-102 | 500
A-222 | -1000
预期结果应为:
ACCOUNT_NO| BALANCE | AMOUNT | CORRECTBALANCE
A-102 | 4000 | 500 | 4500
A-222 | 8000 | -1000 | 7000
A-305 | 2000 | 1300 | 3300
这是因为帐户A-102有两个不同的金额,但来自相同的余额。
答案 0 :(得分:7)
对于您的查询,要将两行分组在一行上,您可以尝试对帐号和余额进行分组:
SELECT T.account_no
,A.balance
,SUM(T.amount) AS TotalAmount
,(A.balance + SUM(T.amount)) AS "CORRECT BALANCE"
FROM transactions AS T
INNER JOIN account AS A ON T.account_no = A.account_no
GROUP BY T.account_no, A.balance;
(顺便说一句,我已经使用了ANSI连接而不是加入表的'旧'方式,因为你用这种方式做得更清楚了。)
编辑
为了让事情更清楚一点,我做了一个 SQL Fiddle 。这或多或少正确地代表了您的情况吗?
<强> EDIT2 强>
上述查询不会显示任何没有交易的帐户,如Kaf所述。这可能是你想要的,但如果不是,你可以像这样切换连接表:
SELECT A.account_no
,A.balance
,SUM(T.amount) AS TotalAmount
,(A.balance + SUM(T.amount)) AS "CORRECT BALANCE"
FROM account AS A
LEFT OUTER JOIN transactions AS T ON T.account_no = A.account_no
GROUP BY A.account_no, A.balance;
答案 1 :(得分:3)
您是否正在寻找如何使用group by来连接表和总和?
第一次查询;
更新:我认为您的 Account table
与 Transaction table
有 1:很多关系,所以,你应该 get the sum from transaction table
,然后加入与 Account
。理想情况下,您需要left join
,如下所示。
select a.account_no,
a.balance,
isnull(x.amount,0) amount,
(a.balance + isnull(x.amount,0)) correctAmount
from account a left join (
select t.account_no, sum(t.amount) amount
from transactions t
group by t.account_no ) x
on a.account_no = x.account_no
SQL-FIDDLE-DEMO(感谢@Josien提供表格和数据)