Sql 返回计数为0的所有记录

Sql 返回计数为0的所有记录,sql,sql-server,count,aggregate,Sql,Sql Server,Count,Aggregate,这是我的最新资料 我想要所有记录,即使列nbDemandes为0,对于每个nomLoi(RRQ和SAE) 因此,实际结果是: nomTypeDemande | nomLoi | nbDemandes --------------- -------- ----------- Chef équipe RRQ 2 Mandat Projet SAE 4 PO RRQ 5 PO

这是我的最新资料

我想要所有记录,即使列
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
再次非常感谢您的帮助:)

将您的第一个
内部连接
s替换为
右连接
/
左连接

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
例如,由于
内部联接
没有对应的行可计算
Comité-SAE
,因此
内部联接
将过滤
SAE

将其更改为
右连接
将确保不会排除来自
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

据我所知,你正在计算需求并进行分类。 问题是,若并没有对某一特定类别的需求,那个么无论如何,它们都不会被计算在内

解决方案可以是按需左连接,因此所有[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:在连接上,您实际上不需要额外的父连接

您应该将内部连接更改为右连接 尝试下面的查询

   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

您好,先生,我尝试过这个,但没有任何不同…:(@Patix80您现在可以重试吗?是的,我再次尝试,但结果相同…例如,在选择捕获计数(0)中添加字段是否有其他方法?@Patix80够疯狂了,我想(我不确定)您可以使用类似于
SUM的方法(当typesnromes.id为NULL时,则为0,否则为1 END)
而不是
COUNT()
。但是我很惊讶用外部联接替换所有内部联接仍然不能返回所需的数据。是的,我也很惊讶右联接或左联接在返回的记录中没有做任何更改…你对SUM的想法(当typesnromes.id为NULL时,则为0,否则为1 END)仍然有效…如Count感谢您如此快速的回答和PS:)。但是返回的记录没有什么不同。@Patix80可能我们缺少了一个细节。如果你发布一个可验证的例子,你可以得到一个更自信的答案。例如考虑使用。请仅使用左连接再试一次,可能您误用了normesLois]和[normesTypesDemande]匹配我尝试了您的请求,但想要的结果不是它应该的结果。。。