Подберите Суммированный столбец в Oracle - PullRequest
0 голосов
/ 20 января 2010

это попытка исправить кристальные отчеты, использующие 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

Ответы [ 2 ]

1 голос
/ 20 января 2010

Ваш 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, никоим образом не зависит от таблиц во внешнем запросе ... Следовательно, он не a Коррелированный SubQuery ... означает, что генерируемое им значение НЕ будет отличаться для каждой строки в наборе результатов внешнего запроса, оно будет одинаковым для каждой строки. Вам нужно как-то поместить что-то в подзапрос, чтобы сделать его зависимым от значения некоторой строки во внешнем запросе, чтобы оно стало коррелированным подзапросом и повторялось бы снова и снова для каждой внешней строки ....

Кроме того, вы упомянули пару подселектов, но я вижу только один. Где другой?

0 голосов
/ 20 января 2010

Использование:

   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

Я согласен с оценкой Чарльза Бретаны, что исходный SELECT в предложении SELECT не коррелировал, поэтому значение для каждой строки никогда не менялось.Но в подсистеме SELECT использовалась таблица EQUITY_ACCOUNTS, которая является основой для основного запроса.Поэтому я удалил объединение и включил таблицу HYPERION_TRIAL_BALANCE в основной запрос, используя LEFT JOIN.Я обернул SUM в NVL, а не COALESCE, потому что я не понял, для какой версии Oracle это.

...