Zonder enige DDL-statements die de tabellen definiëren, is het moeilijk te testen, maar:
- U vergelijkt datums met strings - Oracle voert waarschijnlijk een impliciete conversie terug naar een datum met de waarde van de
NLS_DATE_FORMAT
sessieparameter (wat hopelijkDD-MON-YY
is) ) maar als dit ooit verandert, zal het de query verbreken (en de query zal niet zijn veranderd, dus het zal lastig zijn om te debuggen). Stop met het gebruik van strings als datums en gebruik letterlijke datums - bijv.DATE '2016-01-01'
. - Je hebt de eerste
HAVING
clausule vóór deGROUP BY
clausule - wissel ze om. - Je mengt ook een oude komma-join en ANSI-join - vervang de komma-join door een
INNER JOIN
en verplaats de join-voorwaarde uit deWHERE
clausule. - Groepering op
A.TRADING_DWKEY||A.RM_SM_USER_CODE
is inefficiënt. Je hebt alA.TRADING_DWKEY
als een van deGROUP BY
termen dus voeg de tekenreeksen niet samen, maar voeg gewoon de andere kolom toe aan deGROUP BY
clausule.
Iets als:
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
);