Utan några DDL-satser som definierar tabellerna är det svårt att testa men:
- Du jämför datum med strängar - Oracle gör förmodligen en implicit konvertering tillbaka till ett datum med värdet för
NLS_DATE_FORMAT
sessionsparameter (som förhoppningsvis ärDD-MON-YY
) men om detta någonsin ändras kommer det att bryta frågan (och frågan kommer inte att ha ändrats så det blir jobbigt att felsöka). Sluta använda strängar som datum och använd datumbokstavar - dvsDATE '2016-01-01'
. - Du har den första
HAVING
sats föreGROUP BY
klausul - byt om dem. - Du blandar också en äldre komma-join och ANSI-join - ersätt komma-join med en
INNER JOIN
och flytta kopplingsvillkoret frånWHERE
klausul. - Gruppera efter
A.TRADING_DWKEY||A.RM_SM_USER_CODE
är ineffektivt. Du har redanA.TRADING_DWKEY
som en avGROUP BY
termer så sammanfoga inte strängarna bara inkludera den andra kolumnen iGROUP BY
klausul.
Något i stil med:
Select TRADING_DWKEY,
RM_SM_NAME,
FIRST_TRADE,
'New Footprint' Status,
Null Q4Vol,
CQVol
From (
Select A.TRADING_DWKEY,
q.RM_SM_NAME,
B.FIRST_TRADE,
SUM(A.RISK_AMOUNT_ADJ)/1000000 CQVol
from FACT_TRADE_ROLLUP A
INNER JOIN
( SELECT TRADING_DWKEY,
MIN(FIRST_TRADE_DATE) FIRST_TRADE
FROM ACCOUNT_FIRST_LAST_TRADE_DATES
GROUP BY TRADING_DWKEY
HAVING MIN(FIRST_TRADE_DATE)>= trunc(sysdate-1,'Y')
) B
ON ( A.TRADING_DWKEY=B.TRADING_DWKEY )
INNER JOIN REF_RM_SM_REGION q
ON ( q.RM_SM_USER_CODE = A.RM_SM_USER_CODE )
WHERE A.DATE_KEY >= DATE '2016-01-01'
AND ( ( A.PRODUCT_DWKEY IN('RT')
AND A.Account_Type='Customer'
)
OR A.PRODUCT_DWKEY IN('OB','BS','MM')
)
AND A.Role = 'SM'
GROUP BY A.RM_SM_USER_CODE,
A.TRADING_DWKEY,
q.RM_SM_NAME,
B.FIRST_TRADE
HAVING SUM(A.RISK_AMOUNT_ADJ)>=20000000
);