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]匹配我尝试了您的请求,但想要的结果不是它应该的结果。。。