Nếu không có bất kỳ câu lệnh DDL nào xác định các bảng, rất khó để kiểm tra nhưng:
- Bạn đang so sánh các ngày bằng cách sử dụng chuỗi - Oracle có thể đang thực hiện một chuyển đổi ngầm trở lại một ngày bằng cách sử dụng giá trị của
NLS_DATE_FORMAT
tham số phiên (hy vọng làDD-MON-YY
) nhưng nếu điều này thay đổi thì nó sẽ phá vỡ truy vấn (và truy vấn sẽ không thay đổi nên sẽ rất khó để gỡ lỗi). Ngừng sử dụng các chuỗi làm ngày tháng và sử dụng các ký tự ngày - tức làDATE '2016-01-01'
. - Bạn có
HAVING
đầu tiên trước mệnh đềGROUP BY
mệnh đề - hoán đổi chúng xung quanh. - Bạn cũng đang kết hợp phép nối dấu phẩy cũ và phép nối ANSI - thay thế phép nối dấu phẩy bằng
INNER JOIN
và di chuyển điều kiện tham gia ra khỏiWHERE
mệnh đề. - Nhóm theo
A.TRADING_DWKEY||A.RM_SM_USER_CODE
là không hiệu quả. Bạn đã cóA.TRADING_DWKEY
là một trongGROUP BY
vì vậy không nối các chuỗi, chỉ bao gồm cột khác trongGROUP BY
mệnh đề.
Một cái gì đó như:
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
);