以下是我的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
再次感谢你帮助我:)
答案 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