Без никакви DDL изрази, дефиниращи таблиците, е трудно да се тества, но:
- Сравнявате дати с помощта на низове - Oracle вероятно извършва имплицитно преобразуване обратно към дата, използвайки стойността на
NLS_DATE_FORMAT
параметър на сесията (който се надяваме да еDD-MON-YY
), но ако това някога се промени, това ще прекъсне заявката (и заявката няма да се е променила, така че ще бъде трудно да се отстранят грешки). Спрете да използвате низове като дати и използвайте литерали за дати - т.е.DATE '2016-01-01'
. - Имате първия
HAVING
клауза предиGROUP BY
клауза - разменете ги. - Също така смесвате наследено съединение със запетая и ANSI съединение - заменете съединението със запетая с
INNER JOIN
и преместете условието за присъединяване извънWHERE
клауза. - Групиране по
A.TRADING_DWKEY||A.RM_SM_USER_CODE
е неефективно. Вече иматеA.TRADING_DWKEY
като един отGROUP BY
условия, така че не свързвайте низовете, просто включете другата колона вGROUP BY
клауза.
Нещо като:
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
);