तालिकाओं को परिभाषित करने वाले किसी भी डीडीएल विवरण के बिना परीक्षण करना मुश्किल है लेकिन:
- आप स्ट्रिंग्स का उपयोग करके तिथियों की तुलना कर रहे हैं - Oracle संभवत:
NLS_DATE_FORMAT
के मान का उपयोग करके किसी तिथि पर एक अंतर्निहित रूपांतरण कर रहा है। सत्र पैरामीटर (जो उम्मीद सेDD-MON-YY
. है ) लेकिन अगर यह कभी बदलता है तो यह क्वेरी को तोड़ देगा (और क्वेरी नहीं बदलेगी इसलिए यह डीबग करने के लिए दर्द होगा)। दिनांक के रूप में स्ट्रिंग्स का उपयोग करना बंद करें और दिनांक शाब्दिक का उपयोग करें - अर्थातDATE '2016-01-01'
। - आपके पास पहला
HAVING
. हैGROUP BY
. से पहले क्लॉज खंड - उन्हें चारों ओर स्वैप करें। - आप एक लीगेसी कॉमा जॉइन और एएनएसआई जॉइन भी मिला रहे हैं - कॉमा जॉइन को
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
);