Dans une base de données PostgreSQL, j'ai une table appelée answers . Ce tableau stocke des informations sur la manière dont les utilisateurs ont répondu à une question. Il n'y a que 4 questions dans le tableau. Dans le même temps, le nombre d'utilisateurs qui ont répondu aux questions peut être dynamique et l'utilisateur ne peut répondre qu'à une partie des questions.
Tableau réponses:
select
employee,
(
case when count(question_id = 1) or count(question_id = 2) > 0 then 1 else 0 end
+
case when count(question_id = 3) or count(question_id = 4) > 0 then 1 else 0 end
) as calc
from
answers
group by
employee
3 Réponses :
Vous pouvez essayer d'utiliser la fonction de condition aggravée SUM distincte avec group by .
Requête 1 :
| employee | calc | |----------|------| | Alex | 2 | | Bob | 2 | | Jack | 1 | | Kate | 1 | | Oliver | 2 |
Résultats strong >:
SELECT employee,
(SUM(DISTINCT CASE WHEN QUESTION_ID IN (1,2) THEN 1 ELSE 0 END) +
SUM(DISTINCT CASE WHEN QUESTION_ID IN (3,4) THEN 1 ELSE 0 END)) CALC
FROM answers
GROUP BY employee
Merci beaucoup pour votre réponse. Puis-je vous poser une autre question?! Comment déterminer le nombre d'utilisateurs dont la valeur de la colonne calm est 2? Je dois envelopper votre code dans une sous-requête, ce qui à mon avis n'est pas une bonne pratique.
Semblable à la réponse de D-Shih, cela pourrait également être réalisé en comptant avec un filtre
select
employee,
(
case
when count(question_id) filter (where question_id in(1, 2)) > 0
then 1
else 0
end +
case
when count(question_id) filter (where question_id in(3, 4)) > 0
then 1
else 0
end
) as calc
from answers
group by employee
order by employee
Merci pour votre réponse. Puis-je vous poser une autre question?! Comment déterminer le nombre d'utilisateurs dont la valeur de la colonne calm est 2? Existe-t-il un moyen de le faire sans sous-requête, avec un moyen plus compact?
Quelle est la colonne calme? pour ce que ça vaut -> sélectionnez count (*) dans "yourtable" où calm = 2
Dans Postgres, je formulerais cela comme une agrégation conditionnelle, mais pas avec COUNT(DISTINCT):
select employee,
(max( (question_id in (1, 2))::int ) +
max( (question_id in (3, 4))::int )
) as calc
from answers
group by employee;
En plus d'être plus concis, count (distinct) entraîne généralement plus de frais généraux que les fonctions d'agrégation plus "basiques" telles que min () , max () , count () et sum().
Merci pour cette information. Puis-je vous poser une autre question?! Comment déterminer le nombre d'utilisateurs dont la valeur de la colonne calm est 2? Existe-t-il un moyen de le faire sans sous-requête, avec un moyen plus compact?
@NurzhanNogerbek. . . Les nouvelles questions doivent être posées sous forme de questions et non de commentaires.