Ohne DDL-Anweisungen, die die Tabellen definieren, ist es schwierig zu testen, aber:
- Sie vergleichen Datumsangaben mithilfe von Zeichenfolgen – Oracle führt wahrscheinlich eine implizite Konvertierung zurück in ein Datum durch, wobei der Wert von
NLS_DATE_FORMAT
verwendet wird Sitzungsparameter (der hoffentlichDD-MON-YY
ist ), aber wenn sich dies jemals ändert, wird die Abfrage unterbrochen (und die Abfrage wird sich nicht geändert haben, sodass das Debuggen mühsam sein wird). Hören Sie auf, Zeichenfolgen als Datumsangaben zu verwenden, und verwenden Sie Datumsliterale - z. B.DATE '2016-01-01'
. - Sie haben das erste
HAVING
-Klausel vorGROUP BY
-Klausel - tauschen Sie sie aus. - Sie mischen auch einen alten Komma-Join und einen ANSI-Join - ersetzen Sie den Komma-Join durch einen
INNER JOIN
und verschieben Sie die Join-Bedingung aus demWHERE
Klausel. - Gruppierung nach
A.TRADING_DWKEY||A.RM_SM_USER_CODE
ist ineffizient. Sie haben bereitsA.TRADING_DWKEY
als einer derGROUP BY
Begriffe, verketten Sie die Zeichenfolgen also nicht, sondern schließen Sie die andere Spalte inGROUP BY
ein Klausel.
Etwas wie:
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
);