2010-01-20 26 views
0

这是一个尝试修复一个水晶报告使用2个子报告!在Oracle中选择一个总结栏

我有一个连接3个表的查询,我想用一对子选择引入相同的新表。

这里是在脚本中的第一个两列:

SELECT ea."LOC_ID", lo."DESCR", ea."PEGSTRIP", ea."ENTITY_OWNER" 
, ea."PCT_OWNERSHIP", ea."BEG_BAL", ea."ADDITIONS", ea."DISPOSITIONS" 
, ea."EXPLANATION", ea."END_BAL", ea."NUM_SHARES", ea."PAR_VALUE" 
, ag."DESCR", ea."EOY", ea."FAKEPEGSTRIP", 
(select sum(htb.END_FNC_CUR_US_GAAP) 
from EQUITY_ACCOUNTS ea , HYPERION_TRIAL_BALANCE htb 
where 
htb.PEGSTRIP = ea.PEGSTRIP and 
htb.PRD_NBR = 0 and 
htb.LOC_ID = ea.LOC_ID and 
htb.PRD_YY = ea.EOY 
) firstHyp 
FROM ("TAXPALL"."ACCOUNT_GROUPING" ag 
INNER JOIN "TAXP"."EQUITY_ACCOUNTS" ea 
ON (ag."ACCT_ID"=ea."PEGSTRIP") AND (ag."EOY"=ea."EOY")) 
INNER JOIN "TAXP"."LOCATION" lo ON ea."LOC_ID"=lo."LOC_ID" 
WHERE ea."EOY"=2009 
ORDER BY ea."LOC_ID", ea."PEGSTRIP" 

当此提供的数据集“firstHyp”的价值无法通过pegstrip值改变。它返回一个单独的总数,并且未能通过pegstrip将值设置为正确。 我认为where子句会逐行拾取连接。

我不会经常使用Oracle语法,所以我在这里错过了什么?

TIA

+0

请使用像http://www.dpriver.com/pp/sqlformat.htm – 2010-01-20 00:43:41

回答

1

你的SQL被equivilent以下几点:

SELECT ea."LOC_ID", lo."DESCR", ea."PEGSTRIP", 
     ea."ENTITY_OWNER" , ea."PCT_OWNERSHIP", 
     ea."BEG_BAL", ea."ADDITIONS", ea."DISPOSITIONS" , 
     ea."EXPLANATION", ea."END_BAL", ea."NUM_SHARES", 
     ea."PAR_VALUE" , ag."DESCR", ea."EOY", ea."FAKEPEGSTRIP", 
    (select sum(htb.END_FNC_CUR_US_GAAP) 
     from EQUITY_ACCOUNTS iea 
     Join HYPERION_TRIAL_BALANCE htb 
      On htb.PEGSTRIP = iea.PEGSTRIP 
       and htb.LOC_ID = iea.LOC_ID 
       and htb.PRD_YY = iea.EOY 
     where htb.PRD_NBR = 0) firstHyp 
FROM "TAXPALL"."ACCOUNT_GROUPING" ag 
    JOIN "TAXP"."EQUITY_ACCOUNTS" ea 
     ON ag."ACCT_ID"=ea."PEGSTRIP" 
      AND ag."EOY"=ea."EOY" 
    JOIN "TAXP"."LOCATION" lo 
     ON ea."LOC_ID"=lo."LOC_ID" 
WHERE ea."EOY"=2009 
ORDER BY ea."LOC_ID", ea."PEGSTRIP" 

注意,产生firstHyp子查询是不以任何方式依赖于外部查询的表...因此有一个Correllated子查询...这意味着它生成的值不会在外部查询结果的每一行不同对于每一行,它将是相同的。您需要以某种方式在子查询中添加某些内容,使其依赖于外部查询中某些行的值,以便它将成为相关的子查询并针对每个外部行反复运行一次...

此外,你提到一个的子选择,但我只看到一个。另一个在哪里?

+0

这样的工具格式化sql谢谢Charles。我认为这个子查询通过我的where子句而不是连接条件挂钩到当前数据集中。 (SELECT SUM(htb.END_FNC_CUR_US_GAAP) 从EQUITY_ACCOUNTS EA,HYPERION_TRIAL_BALANCE HTB 其中(htb.PEGSTRIP = ea.PEGSTRIP 和htb.PRD_NBR = 0 和htb.LOC_ID = ea.LOC_ID 和htb.PRD_YY = EA .EOY))firstHyp – SteveO 2010-01-20 01:47:39

+0

但您现在看到,除了'htb.PRD_NBR = 0',子查询where子句基于子查询表(别名ea和htb)中的值,而不是外部表中的任何值。要使它成为一个ccorrelatted子查询,它需要依赖于表ag或外部ea中的某些内容。顺便说一句,你不应该对EQUITY_ACCOUNTS表的内部和外部查询引用使用相同的别名('ea')) – 2010-01-20 02:06:03

0

用途:

SELECT ea.LOC_ID, 
      lo.DESCR, 
      ea.PEGSTRIP, 
      ea.ENTITY_OWNER, 
      ea.PCT_OWNERSHIP, 
      ea.BEG_BAL, 
      ea.ADDITIONS, 
      ea.DISPOSITIONS, 
      ea.EXPLANATION, 
      ea.END_BAL, 
      ea.NUM_SHARES, 
      ea.PAR_VALUE, 
      ag.DESCR, 
      ea.EOY, 
      ea.FAKEPEGSTRIP, 
      NVL(SUM(htb.END_FNC_CUR_US_GAAP), 0) AS firstHyp 
    FROM TAXPALL.ACCOUNT_GROUPING ag 
    JOIN TAXP.EQUITY_ACCOUNTS ea ON ea.PEGSTRIP = ag.ACCT_ID 
           AND ea.EOY = ag.EOY 
           AND ea.EOY = 2009 
    JOIN TAXP.LOCATION lo ON lo.LOC_ID = ea.LOC_ID 
LEFT JOIN HYPERION_TRIAL_BALANCE htb ON htb.PEGSTRIP = ea.PEGSTRIP 
            AND htb.LOC_ID = ea.LOC_ID 
            AND htb.PRD_YY = ea.EOY 
            AND htb.PRD_NBR = 0 
GROUP BY ea.LOC_ID, 
      lo.DESCR, 
      ea.PEGSTRIP, 
      ea.ENTITY_OWNER, 
      ea.PCT_OWNERSHIP, 
      ea.BEG_BAL, 
      ea.ADDITIONS, 
      ea.DISPOSITIONS, 
      ea.EXPLANATION, 
      ea.END_BAL, 
      ea.NUM_SHARES, 
      ea.PAR_VALUE, 
      ag.DESCR, 
      ea.EOY, 
      ea.FAKEPEGSTRIP, 
ORDER BY ea.LOC_ID, ea.PEGSTRIP 

我与查尔斯BRETANA的评估,即原来的SELECT SELECT子句中没有相关性,这就是为什么值每行从来没有改变过同意。但子SELECT使用EQUITY_ACCOUNTS表,这是主要查询的基础。所以我删除了连接,并使用LEFT JOINHYPERION_TRIAL_BALANCE表合并到主查询中。我将SUM包装在NVL而不是COALESCE中,因为我没有看到Oracle的这个版本。