Newb帮助设计查询以在同一个表中减去两个查询的结果

时间:2014-03-11 13:51:39

标签: sql

我已经看到过像这样的其他问题,但感觉我的有点不同,或者在其他问题中没有完全理解SQL ......所以如果这个问题多余或非常容易,我会道歉...... / p>

无论如何,我有一个会计交易数据库,它在我们的金融系统中存储每一笔交易。我想要做的是净额每个GL帐户的借方和贷方的总和。

以下是我正在执行的两个基本查询,以获取我想要的结果。

查询1 向我提供了发布到每个gl帐户的所有借记交易的总和:

Select gl_debit, sum (amt) from FISC_YEAR2014 where fund = 'XXX'
group by gl_debit

查询2 向我提供了发布到每个gl帐户的所有信用交易的总和:

select gl_credit, sum (amt) from FISC_YEAR2014 where fund = 'XXX'
group by gl_credt

现在我要从借方金额中减去贷方金额,以获得每个gl账户的净额。有意义吗?

感谢。

3 个答案:

答案 0 :(得分:0)

根据您的表定义,有两种方法可以执行此操作。我认为你的情况是第一次。

这是假设信用和借方在不同列中的正常方式:

SELECT sum(gl_debit)-sum(gl_credit) as net_debit 
FROM FISC_YEAR2014
WHERE fund = 'XXX'

这是假设方向由单独的列表示的另一种方式:

SELECT SUM(IF(is_debit=1,amount,-1*amount)) as net_debit 
FROM FISC_YEAR2014
WHERE fund = 'XXX'

另见:

答案 1 :(得分:0)

我相信这就是你所需要的:

select
    gl_account,
    sum(amt)
from
(   
    select gl_debit gl_account,
           sum(-amt) amt 
      from fisc_year2014
     where fund = 'XXX'
     group by gl_debit
  union all
    select gl_credit,
           sum(amt)
      from fisc_year2014
     where fund = 'XXX'
     group by gl_credit
)
group by
    gl_account

有两个SELECT:一个用于获取(负)借方,另一个用于获得贷方。它们是UNIONed以创建两列结果。外部SELECT然后通过gl_account代码聚合总和。如果存在不匹配(没有gl_credit的gl_debit,反之亦然),则仍会显示其数量。

SQLFiddle here(我添加了另一行来显示不匹配ID的影响)

答案 2 :(得分:0)

要执行此操作,您应在子查询中单独SUM借记和贷记,然后在gl_credit = gl_debit上加入这些子查询。

SELECT COALESCE(gl_credit, gl_debit) AS Id
      ,COALESCE(d.amt,0)-COALESCE(c.amt,0) AS Net
FROM (
    SELECT gl_debit, SUM(amt) AS amt
    FROM FISC_YEAR2014
    GROUP BY gl_debit  
) d 
FULL OUTER JOIN (
    SELECT gl_credit, SUM(amt) AS amt
    FROM FISC_YEAR2014
    GROUP BY gl_credit  
) c ON d.gl_debit = c.gl_credit
ORDER BY COALESCE(gl_credit, gl_debit)

SQLFiddle

输出:

ID      Net
-----------
101    -475
201     225
301     500
501    -250

如果我不是您使用FULL OUTER JOIN,我会从帐户表或存储它们的任何位置选择id,然后LEFT JOIN两个子查询它没有显示任何其他表格,所以我只能推测。

相关问题