有一個年都月份臨時表,一個 每月金額結果表,通過left join所希望的最終結果爲:每個月金額多少,如果這個沒有金額,則爲0。
月份臨時表:
SELECT DISTINCT bgbh,nd,yf FROM SJQX.t_bg_yflsb WHERE BGBH = 'BG202004260001'
金額結果表:
SELECT * FROM SJQX.T_BG_00003 T WHERE T.BGBH = 'BG202004260004';
通過LEFT JOIN 語句得到的結果爲:
SELECT
CASE WHEN T.ynse IS NULL THEN 0 ELSE T.ynse END AS ynse,
CASE WHEN T.snse IS NULL THEN 0 ELSE T.snse END AS snse,
T.yf as sj,T.nd,
CASE WHEN T.sbfs IS NULL THEN '2' ELSE T.sbfs END AS sbfs
FROM (
SELECT T1.ynse,T1.snse,T2.yf,T2.nd,T1.sbfs
FROM
(SELECT DISTINCT bgbh,nd,yf FROM SJQX.t_bg_yflsb WHERE BGBH = 'BG202004260001') t2
LEFT JOIN
SJQX.T_BG_00003 T1 ON T1.sm = T2.yf and T1.nd =t2.nd
WHERE T1.BGBH = 'BG202004260004' ) T ORDER BY nd,yf;
沒有得到如果在金額表裏匹配到得到金額數值,如果沒有匹配到則默認爲空展示0的效果。
原因:where是先連接然後再篩選 。
解決方法 :將where 換成and 即:
SELECT
CASE WHEN T.ynse IS NULL THEN 0 ELSE T.ynse END AS ynse,
CASE WHEN T.snse IS NULL THEN 0 ELSE T.snse END AS snse,
T.yf as sj,T.nd,
CASE WHEN T.sbfs IS NULL THEN '2' ELSE T.sbfs END AS sbfs
FROM (
SELECT T1.ynse,T1.snse,T2.yf,T2.nd,T1.sbfs
FROM
(SELECT DISTINCT bgbh,nd,yf FROM SJQX.t_bg_yflsb WHERE BGBH = 'BG202004260004') t2
LEFT JOIN
SJQX.T_BG_00003 T1 ON T1.sm = T2.yf and T1.nd =t2.nd
and (T1.BGBH = 'BG202004260004' ) ) T ORDER BY nd,yf;