Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按两个表分组的SQL和_Sql_Group By_Sum - Fatal编程技术网

按两个表分组的SQL和

按两个表分组的SQL和,sql,group-by,sum,Sql,Group By,Sum,我在编写一个SQL查询时遇到了困难,该查询将正确地将account_no分组并减去一个金额 首先,我写了这个查询,除了账户A-102应该是4500,而不是两个不同的正确余额之外,它更新了一切 select transactions.account_no, account.balance, transactions.amount, (account.balance + transactions.amount) AS "CORRECT BALANCE" from transactions, acco

我在编写一个SQL查询时遇到了困难,该查询将正确地将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    
我试着按科目进行汇总和分组,但我无法解决如何使用这两个表。这只是我试过但没能开始工作的事情

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有两个不同的金额,但来自同一余额。

您是否正在研究如何使用group by联接表和求和

第一个查询

更新:我认为您的
账户表
交易表
有1:多关系,因此,您应该
从交易表
中获取金额,然后加入
账户
。理想情况下,您需要一个
左连接
,如下所示

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

(感谢@Josien提供表格和数据)

对于您的查询,要将两行分组到一行,您可以尝试按账号和余额分组:

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连接而不是“旧”的连接表的方法,因为这样做更清楚。)

编辑

为了让事情更清楚一点,我做了一个。这或多或少正确地反映了你的情况吗

EDIT2

如上所述,上述查询不会显示任何没有交易记录的账户。这可能是您想要的,但如果不是这样,您可以这样切换联接表:

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;

根据给定数据:A-102有两个记录,每个记录有4000个余额。当总和=4000+4000>8000时?你能用预期的结果更新这个问题吗?@Sjrsmile:我已经更新了答案,通过查看你的预期结果,我认为你需要
余额+总和(t.amount)
。但是我不知道为什么我会按余额分组。@Sjrsmile,不要接受第一个查询,它只对给定的数据有效。第二个更新的查询是正确的,因为您的account表与transaction表具有1对多的关系,因此,您应该从transaction中获取总和,然后与account进行联接。+1,尽管它看起来比我的解决方案复杂得多:-)我收回了这一点,我现在尝试的方法有效。干得好,伙计们!两个相同的账号是否会出现不同的余额,例如“a-102”的余额为4000,“a-102”的余额为3200?不,余额应该完全相同。它出现了两次,因为在表中它是一个联合帐户,所以它包含两个不同的名称。它总是意味着完全一样。我明白了。您看过我的查询解决方案了吗?@Sjrsmile:我不担心您选择这个答案,但根据您的表结构,我认为最好的办法是在加入之前从事务表中获取总和,以避免不必要的分组。这就是为什么我从我的帖子中删除了相同的答案。。此外,此查询不会为事务表中没有记录的帐户提供任何记录。@Kaf:关于没有事务的记录,您是绝对正确的。我将添加一个查询来处理这个问题(基本上是切换连接顺序)。至于加入前的金额,我不确定这是否是个问题。你能想出一个这样做会出错的例子吗?没有错,但我认为可以通过先求和然后求和来避免不必要的分组。不管怎么说,他已经得到了他所需要的东西,然后消失了…真的。。。啊,不被爱的志愿者大军的艰辛…:-)