应用DISTINCT SUM

时间:2014-04-10 02:48:42

标签: sql oracle toad

我正在编写一个代码,可以帮助我在表格中获得GL子头的总和(这是一个会计术语)。事实上,有多个行具有相同的GL子头但具有不同的量。我需要总结每个GL Sub Head的表格数量。当然,这涉及使用SUMDISTINCT条款。这是我到目前为止所拥有的:

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应该有所作为。

1 个答案:

答案 0 :(得分:0)

  

“无论我是否拥有DISTINCT条款,我都会得到相同的结果。”

这意味着您的查询已经返回一组唯一的行。

  

我觉得我的代码有问题,正如我所期待的那样,DISTINCT应该会有所作为。

你为什么这么想?

DISTINCT在您的第一个查询中有所不同,因为您没有在子查询的投影中包含bal_date。因此,您有一些gl_sub_head个实例,其中余额在多天内相同。

除非您在bal_date上进行过滤,因此无论如何您只应获得一个值。 Hmmmm ....

显然,您的查询中存在一些问题。有两个明显的益智游戏。

  1. 为什么你与gstt进行LEFT OUTER JOIN? gstt.bal_date上的硬过滤器意味着您只返回gstt.bal_date不为空的记录,因此如果是INNER JOIN,结果集仍然是相同的。

  2. 为什么要费心查询eab?您不使用它的任何值,LEFT OUTER JOIN意味着它不会限制从gam检索的值。此外,您已在eab.eod_date上注释掉过滤器这一事实表明它当前会生成交叉连接,这可能会生成多个重复值,您认为需要使用DISTINCT来根除。

  3. 所以,我没有给你一个真正的答案,但我认为你需要重新访问你的业务逻辑并找出你的查询实际需要做什么。