Uden nogen DDL-sætninger, der definerer tabellerne, er det svært at teste, men:
- Du sammenligner datoer ved hjælp af strenge - Oracle laver sandsynligvis en implicit konvertering tilbage til en dato ved hjælp af værdien af
NLS_DATE_FORMAT
sessionsparameter (som forhåbentlig erDD-MON-YY
), men hvis dette nogensinde ændrer sig, vil det bryde forespørgslen (og forespørgslen vil ikke have ændret sig, så det vil være en smerte at fejlfinde). Stop med at bruge strenge som datoer, og brug bogstaver for dato - dvs.DATE '2016-01-01'
. - Du har den første
HAVING
klausul førGROUP BY
klausul - skift dem rundt. - Du blander også en ældre komma-join og ANSI-join - erstat komma-join med en
INNER JOIN
og flyt forbindelsesbetingelsen ud afWHERE
klausul. - Grupper efter
A.TRADING_DWKEY||A.RM_SM_USER_CODE
er ineffektiv. Du har alleredeA.TRADING_DWKEY
som en af GROUP BY
termer, så lad være med at sammenkæde strengene, bare medtag den anden kolonne iGROUP BY
klausul.
Noget som:
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
);