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_FORMATsessionsparameter (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
HAVINGklausul førGROUP BYklausul - skift dem rundt. - Du blander også en ældre komma-join og ANSI-join - erstat komma-join med en
INNER JOINog flyt forbindelsesbetingelsen ud afWHEREklausul. - Grupper efter
A.TRADING_DWKEY||A.RM_SM_USER_CODEer ineffektiv. Du har alleredeA.TRADING_DWKEYsom en af GROUP BYtermer, så lad være med at sammenkæde strengene, bare medtag den anden kolonne iGROUP BYklausul.
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
);