【问题标题】:Subselect a Summed col in Oracle在 Oracle 中子选择求和列
【发布时间】:2010-01-20 00:34:42
【问题描述】:

这是对水晶报告使用 2 个子报告的尝试修复!

我有一个连接 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

【问题讨论】:

标签: sql subquery correlated-subquery


【解决方案1】:

您的 SQL 等同于以下内容:

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 的子查询绝不依赖于外部查询中的表...因此 不是 相关子查询...意味着它生成的值对于外部查询的结果集中的每一行不会不同,它会是每一行的相同。您需要以某种方式在子查询中放置一些内容,使其依赖于外部查询中某行的值,以便它将成为相关子查询并为每个外部行反复运行一次......

另外,您提到了 pair 子选择,但我只看到一个。另一个在哪里?

【讨论】:

  • 谢谢查尔斯。我认为这个子查询通过我的 where 子句而不是连接条件挂钩到当前数据集。 (从 EQUITY_ACCOUNTS ea 中选择 sum(htb.END_FNC_CUR_US_GAAP) ,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跨度>
  • 但是您现在看到,除了htb.PRD_NBR = 0,子查询 where 子句基于子查询表(别名 ea 和 htb)中的值,而不是外部表中的任何值...它是一个相关子查询,它需要依赖于表 ag 或外部 ea 中的某些内容。顺便说一句,您不应该对 EQUITY_ACCOUNTS 表的内部和外部查询引用使用相同的别名 ('ea'))
【解决方案2】:

用途:

   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

我同意 Charles Bretana 的评估,即 SELECT 子句中的原始 SELECT 不相关,这就是为什么每行的值从未改变的原因。但是子 SELECT 使用了 EQUITY_ACCOUNTS 表,这是主查询的基础。所以我删除了连接,并使用LEFT JOINHYPERION_TRIAL_BALANCE 表合并到主查询中。我将 SUM 包装在 NVL 而不是 COALESCE 中,因为我没有知道这是用于什么版本的 Oracle。

【讨论】:

    猜你喜欢
    • 2018-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    相关资源
    最近更新 更多