首页 > 解决方案 > 求和而不计算重复值 SQL

问题描述

我有一个suivis包含列 id_action 和 id_individu 的表,该表可以包含多个重复值(不是整行,只有列)。

例子 : 在此处输入图像描述

我还有一个individus包含一列的表statut_collaborateur,该表可以有两个值:'no' 和'granted'。

我需要帮助来计算 id_individu 的数量 statut_collaborateur = no 和 statut_collaborateur = 授予但只有一次。

现在,我设法做到了:

SELECT  j.date_debut, j.date_fin, j.titre, so.id_identite, so.nom_societe,
        SUM(CASE WHEN (i.statut_collaborateur = 'granted') THEN 1 ELSE 0 END) AS interne, 
        SUM(CASE WHEN (i.statut_collaborateur = 'no') THEN 1 ELSE 0 END) AS externe, 
        r.nom_responsable 
FROM individus AS i 
    LEFT JOIN suivis AS s ON s.id_individu = i.id_individu 
    LEFT JOIN jurys AS j ON j.id_jury = s.id_jury 
    LEFT JOIN societes AS so ON so.id_societe = j.id_societe 
    LEFT JOIN responsables AS r ON r.id_responsable = j.id_responsable 
WHERE s.id_action = 22 
AND j.statut IN (1,3) 
AND j.date_debut BETWEEN '2018-01-01 00:00:00' AND '2018-10-23 23:59:59' 
GROUP BY s.id_jury`

主要问题是我必须在总和中完成,我也尝试过计数但结果相同,我的计数是 5,它应该是 3(3 个不同的个体)。

标签: sql

解决方案


仅使用表 individus 的不同语句连接所需的列

 SELECT  j.date_debut, j.date_fin, j.titre, so.id_identite, so.nom_societe,
                SUM(CASE WHEN (i.statut_collaborateur = 'granted') THEN 1 ELSE 0 END) AS interne, 
                SUM(CASE WHEN (i.statut_collaborateur = 'no') THEN 1 ELSE 0 END) AS externe, 
                r.nom_responsable 
        FROM (SELECT DISTINCT i.id_individu ,i.statut_collaborateur from individus )AS i 
            LEFT JOIN suivis AS s ON s.id_individu = i.id_individu 
            LEFT JOIN jurys AS j ON j.id_jury = s.id_jury 
            LEFT JOIN societes AS so ON so.id_societe = j.id_societe 
            LEFT JOIN responsables AS r ON r.id_responsable = j.id_responsable 
        WHERE s.id_action = 22 
        AND j.statut IN (1,3) 
        AND j.date_debut BETWEEN '2018-01-01 00:00:00' AND '2018-10-23 23:59:59' 
GROUP BY j.date_debut, j.date_fin, j.titre, so.id_identite, so.nom_societe,r.nom_responsable

推荐阅读