我创建这个查询显示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