我正在编写一个代码,可以帮助我在表格中获得GL子头的总和(这是一个会计术语)。事实上,有多个行具有相同的GL子头但具有不同的量。我需要总结每个GL Sub Head的表格数量。当然,这涉及使用SUM
和DISTINCT
条款。这是我到目前为止所拥有的:
select
gstt.bal_date,
sum(gstt.tot_dr_bal) as totalDr,
sum(gstt.tot_cr_bal) as totalCr
from(
select distinct
gam.gl_sub_head_code,
gstt.tot_dr_bal,
gstt.tot_cr_bal
from tbaadm.gam
left outer join tbaadm.eab
on gam.acid = eab.acid
and gam.bank_id = eab.bank_id
left outer join tbaadm.gstt
on gam.sol_id = gstt.sol_id
and gam.bank_id = gstt.bank_id
and gam.gl_sub_head_code = gstt.gl_sub_head_code
and gam.acct_crncy_code = gstt.crncy_code
where
gam.acct_ownership = 'O'
--and eab.eod_date = TO_DATE('3/24/2014', 'MM/DD/YYYY')
and gstt.bal_date = TO_DATE('3/24/2014', 'MM/DD/YYYY')
) group by gstt.bal_date, totalDr, totalCr
但是,无法让血腥的东西发挥作用。我知道我错过了什么,我只是不知道它是什么,我应该把它放在代码中。任何帮助,将不胜感激。如果您需要进一步澄清,请询问。
修改
我现在有一些代码可以运行了。因为有问题。
select
bal_date,
gl_sub_head_code,
sum(tot_dr_bal),
sum(tot_cr_bal)
from(
select distinct
gam.gl_sub_head_code,
gstt.tot_dr_bal,
gstt.tot_cr_bal,
gstt.bal_date
from tbaadm.gam
left outer join tbaadm.eab
on gam.acid = eab.acid
and gam.bank_id = eab.bank_id
left outer join tbaadm.gstt
on gam.sol_id = gstt.sol_id
and gam.bank_id = gstt.bank_id
and gam.gl_sub_head_code = gstt.gl_sub_head_code
and gam.acct_crncy_code = gstt.crncy_code
where
gam.acct_ownership = 'O'
--and eab.eod_date = TO_DATE('3/24/2014', 'MM/DD/YYYY')
and gstt.bal_date = TO_DATE('3/24/2014', 'MM/DD/YYYY')
) group by bal_date, gl_sub_head_code
如您所见,子查询的开头有一个DISTINCT
子句。每当我删除它,TOAD输出相同的结果集。无论我是否有DISTINCT
条款,我都会得到相同的结果。我觉得我的代码有问题,因为我期待的是DISTINCT
应该有所作为。
答案 0 :(得分:0)
“无论我是否拥有DISTINCT条款,我都会得到相同的结果。”
这意味着您的查询已经返回一组唯一的行。
我觉得我的代码有问题,正如我所期待的那样,DISTINCT应该会有所作为。
你为什么这么想?
DISTINCT在您的第一个查询中有所不同,因为您没有在子查询的投影中包含bal_date
。因此,您有一些gl_sub_head
个实例,其中余额在多天内相同。
除非您在bal_date
上进行过滤,因此无论如何您只应获得一个值。 Hmmmm ....
显然,您的查询中存在一些问题。有两个明显的益智游戏。
为什么你与gstt
进行LEFT OUTER JOIN? gstt.bal_date
上的硬过滤器意味着您只返回gstt.bal_date
不为空的记录,因此如果是INNER JOIN,结果集仍然是相同的。
为什么要费心查询eab
?您不使用它的任何值,LEFT OUTER JOIN意味着它不会限制从gam
检索的值。此外,您已在eab.eod_date
上注释掉过滤器这一事实表明它当前会生成交叉连接,这可能会生成多个重复值,您认为需要使用DISTINCT来根除。
所以,我没有给你一个真正的答案,但我认为你需要重新访问你的业务逻辑并找出你的查询实际需要做什么。