テーブルを定義する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
の1つとして 用語なので、文字列を連結しないでください。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
);