我已经看到过像这样的其他问题,但感觉我的有点不同,或者在其他问题中没有完全理解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账户的净额。有意义吗?
感谢。
答案 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)
输出:
ID Net
-----------
101 -475
201 225
301 500
501 -250
如果我不是您使用FULL OUTER JOIN
,我会从帐户表或存储它们的任何位置选择id
,然后LEFT JOIN
两个子查询它没有显示任何其他表格,所以我只能推测。