1
votes

Comment faire des calculs corrects?

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


0 commentaires

3 Réponses :


1
votes

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


1 commentaires

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.



1
votes

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


2 commentaires

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



1
votes

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().


2 commentaires

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.