2010-01-20 3 views
0

Это попытка исправить кристальное сообщение с использованием двух вспомогательных отчетов!Подзапрос Summed col в 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, так что мне здесь не хватает?

ТИА

+0

отформатируйте sql с помощью таких инструментов, как http://www.dpriver.com/pp/sqlformat.htm –

ответ

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 подзапрос ... это означает, что значение, которое генерирует не будет отличаться для каждой строки в результатах внешнего запроса в et, это будет то же для каждой строки. Вам нужно как-то поместить что-то в подзапрос, который делает его зависимым от значения некоторой строки во внешнем запросе, чтобы он стал коррелированным подзапросом и повторялся один раз для каждой внешней строки ....

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

+0

Спасибо Чарльз. Я думал, что этот подзапрос имеет крючки в текущий набор данных через мое предложение where, а не условие соединения. (выберите сумму (htb.END_FNC_CUR_US_GAAP) от EQUITY_ACCOUNTS еа, HYPERION_TRIAL_BALANCE HTB где (htb.PEGSTRIP = ea.PEGSTRIP и htb.PRD_NBR = 0 и htb.LOC_ID = ea.LOC_ID и htb.PRD_YY = еа .EOY)) firstHyp – SteveO

+0

Но теперь вы видите, что за исключением 'htb.PRD_NBR = 0' подзапроса, где предложение основано на значениях в таблицах подзапросов (псевдонимы ea и htb), а не на любых значениях во внешних таблицах ... Чтобы сделать его ccorrelatted подзапросом, он должен зависеть от чего-то из таблиц ag или внешнего ea. btw, вы не должны использовать один и тот же псевдоним ('ea') для внутренних и внешних ссылок запросов к таблице EQUITY_ACCOUNTS) –

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, что оригинал ВЫБРАТЬ в ЗЕЬЕСТЕ не коррелирует, поэтому значение не изменилось в строку. Но sub SELECT использовал таблицу EQUITY_ACCOUNTS, которая является основой для основного запроса. Поэтому я удалил соединение и включил таблицу HYPERION_TRIAL_BALANCE в основной запрос, используя LEFT JOIN. Я завернул SUM в NVL, а не COALESCE, потому что я не понял, для какой версии Oracle это для.