2017-07-18 108 views
0

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

什么是现在显示:没有。

+0

小心不要在WHERE中用NULL禁止谓词限制左连接表。这样你可以将LEFT JOIN变成INNER。将'EXTRACT(MONTH FROM m.date_fin :: DATE)= EXTRACT(MONTH FROM '01/04/2017':: DATE)''移动到'ON' – Serg

+0

@将条件从WHERE移动到ON '是失去了查询的好行为,这意味着查询将显示错误的结果 –

+0

这是否意味着您需要INNER JOIN?然后返回没有行是完全可以的。 – Serg

回答

0

“问题”是,当你分组时,你失去了没有任何东西可以分组的行。

我通常只是将聚合查询返回到我最初选择的表中。

SELECT 
    s.designation, 
    COALESCE(s.valeur, 0) -- coalesce the NULL rows to zero 
FROM sch_gparc.maint_categorie_maintenance cat 
LEFT JOIN (
    SELECT 
     c.id, 
     CASE 
      WHEN (c.designation <> '') THEN UPPER(c.designation) 
      ELSE 'CATEGORIE INCONNU' 
     END AS designation, 
     SUM (lg.montant_categorie_maintenance) 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 
      AND 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 
) s ON (s.id = cat.id) 
+0

给出的结果是inccorect(当您使用条件'm.type_maintenance ='PREVENTIVE''时)结果在每行中必须为0 –

+0

那么,没有测试数据就很难产生工作查询。结果如何不正确? – Sevanteri

0

我已尝试以下步骤之一,它的工作:

select c.designation , coalesce(gm.valeur,0) as valeur 
from sch_gparc.maint_categorie_maintenance c 
left join (SELECT 
    CASE 
     WHEN (c.designation <> '') THEN UPPER(c.designation) 
     ELSE 'CATEGORIE INCONNU' 
    END AS designation, 
    CASE 
     WHEN COUNT(m.id) > 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/05/2017'::DATE) 
    AND EXTRACT(YEAR FROM m.date_fin::DATE) = EXTRACT(YEAR FROM '01/05/2017'::DATE) 
    AND m.type_maintenance = 'PREVENTIVE') or m.id is null 
GROUP BY 1)gm on gm.designation = UPPER(c.designation) 

希望有所帮助你。

+0

非常感谢 –