返回COUNT = 0的所有记录

时间:2017-02-14 14:40:09

标签: sql sql-server count aggregate

以下是我的query on SQL Fiddle

的更新

我希望所有记录,即使 nbDemandes 列为0,每个 nomLoi RRQ SAE )。

所以,实际结果:

nomTypeDemande  | nomLoi    | nbDemandes
---------------   --------    -----------
Chef équipe       RRQ         2
Mandat Projet     SAE         4
PO                RRQ         5
PO                SAE         1

通缉结果:

nomTypeDemande  | nomLoi    | nbDemandes
---------------   --------    -----------
Chef équipe       RRQ         2
Chef équipe       SAE         0
Mandat Projet     RRQ         0
Mandat Projet     SAE         4
PO                RRQ         5
PO                SAE         1

再次感谢你帮助我:)

3 个答案:

答案 0 :(得分:1)

将您的第一个INNER JOIN替换为RIGHT JOIN / LEFT JOIN

SELECT normesTypesDemande.choix AS nomTypeDemande,
    normesLois.choix AS nomLoi,
    COUNT(*) as nbDemandes
FROM ((gestionDemandes.typeNormes 
    RIGHT JOIN gestionDemandes.normesLois 
        ON typeNormes.loi = normesLois.id) 
    LEFT JOIN gestionDemandes.normesTypesDemande 
        ON typeNormes.typeDemande = normesTypesDemande.id) 
    LEFT JOIN gestionDemandes.demandes 
        ON typeNormes.demande = demandes.id
GROUP BY normesTypesDemande.choix, normesLois.choix
ORDER BY normesTypesDemande.choix

由于INNER JOIN并且没有相应的行可以计算Comité - SAE,因此INNER JOIN会过滤SAE行。

将其更改为RIGHT JOIN将确保不会排除normesLois中的任何数据,并且您应该0计数。

<强>更新

嗯,不是最优雅,但这是解决方案:

SELECT nomTypeDemande
    , choix
    , sum(nbDemandes) AS nbDemandes
FROM (
    SELECT r.nomTypeDemande
        , nl.choix
        , CASE 
            WHEN r.nomLoi = nl.choix
                THEN sum(r.nbDemandes)
            ELSE 0
            END AS nbDemandes
    FROM (
        SELECT normesTypesDemande.choix AS nomTypeDemande
            , normesLois.choix AS nomLoi
            , COUNT(typeNormes.id) AS nbDemandes
        FROM normesLois
        FULL JOIN typeNormes
            ON typeNormes.loi = normesLois.id
        FULL JOIN normesTypesDemande
            ON typeNormes.typeDemande = normesTypesDemande.id
        GROUP BY normesTypesDemande.choix
            , normesLois.choix
        ) r
    CROSS JOIN normesLois nl
    GROUP BY r.nomTypeDemande
        , nl.choix
        , r.nomLoi
    ) r
GROUP BY nomTypeDemande
    , choix
ORDER BY nomTypeDemande
    , choix

答案 1 :(得分:0)

据我所知,你正在计算需求和分类。 问题是如果没有特定类别的需求,他们将不会被计算在内。

解决方案可以是一个左连接,因此即使没有来自该类型的要求,也会返回所有[normesLois]和[normesTypesDemande]。

SELECT normesTypesDemande.choix AS nomTypeDemande,
       normesLois.choix AS nomLoi,
       COUNT(typeNormes.id) as nbDemandes
FROM gestionDemandes.typeNormes
INNER JOIN gestionDemandes.normesLois ON typeNormes.loi = normesLois.id
INNER JOIN gestionDemandes.normesTypesDemande ON typeNormes.typeDemande = normesTypesDemande.id 
LEFT JOIN gestionDemandes.demandes ON typeNormes.demande = demandes.id
GROUP BY normesTypesDemande.choix, normesLois.choix
ORDER BY normesTypesDemande.choix

PS:你真的不需要对连接进行额外的麻痹

答案 2 :(得分:0)

您应该更改内部到右侧的连接 尝试以下查询。

   SELECT 
            T3.choix AS nomTypeDemande,
            T2.choix AS nomLoi,
            COUNT(T1.id) as nbDemandes
    FROM    gestionDemandes.typeNormes T1
            RIGHT JOIN gestionDemandes.normesLois T2 ON T1.loi = T2.id 
            RIGHT JOIN gestionDemandes.normesTypesDemande T3 ON T1.typeDemande = T3.id 
            INNER JOIN gestionDemandes.demandes T4 ON T1.demande = T4.id
    GROUP BY T3.choix, T2.choix
    ORDER BY T3.choix