我創建這個查詢顯示0,即使沒有排
SELECT
CASE
WHEN (c.designation <> '') THEN UPPER(c.designation)
ELSE 'CATEGORIE INCONNU'
END AS designation,
CASE
WHEN COUNT(lg) > 0 THEN SUM (lg.montant_categorie_maintenance)
ELSE 0
END AS valeur
FROM sch_gparc.maint_categorie_maintenance c
LEFT JOIN sch_gparc.maint_lg_categorie_maintenance lg
ON lg.id_categorie = c.id
LEFT JOIN sch_gparc.maint_maintenance m
ON lg.id_maintenance = m.id
WHERE EXTRACT(MONTH FROM m.date_fin::DATE) = EXTRACT(MONTH FROM '01/04/2017'::DATE)
AND EXTRACT(YEAR FROM m.date_fin::DATE) = EXTRACT(YEAR FROM '01/04/2017'::DATE)
AND m.type_maintenance = 'PREVENTIVE'
GROUP BY c.designation
此查詢的目的是要顯示所有c.designation
,如果沒有記錄顯示0
。
問題是:它不顯示任何內容(當我執行左連接時沒有記錄)。
編輯:所需的數據
| designation | value |
| MOTEUR | 0 |
| DIVERS | 0 |
什麼是現在顯示:沒有。
小心不要在WHERE中用NULL禁止謂詞限制左連接表。這樣你可以將LEFT JOIN變成INNER。將'EXTRACT(MONTH FROM m.date_fin :: DATE)= EXTRACT(MONTH FROM '01/04/2017':: DATE)''移動到'ON' – Serg
@將條件從WHERE移動到ON '是失去了查詢的好行爲,這意味着查詢將顯示錯誤的結果 –
這是否意味着您需要INNER JOIN?然後返回沒有行是完全可以的。 – Serg