IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes PostgreSQL Discussion :

Problème de comptage [11]


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Services à domicile

    Informations forums :
    Inscription : Septembre 2005
    Messages : 197
    Points : 121
    Points
    121
    Par défaut Problème de comptage
    Bonjour,

    Je cherche à faire 2 comptages sur les données d'une table avec un groupage sur un champ.
    Voici un exemple de données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     sends_id | status | result
    ----------+--------+----------
     119      | er     | 7dccs11x
     119      | er     |
     120      | po     | 5bde48u1
     120      | pu     |
     121      | po     | a1d9tbg8
    Je cherche à faire ceci :
    - compter le nombre de ligne avec sends_id identique -> n_total
    - compter le nombre de ligne dont status = "po" et result = valeur non vide
    Ce qui devrait me donner ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     sends_id | n_total | n_ok
    --------------------+------
     119      | 2       | 0
     120      | 2       | 1
     121      | 1       | 1
    J'ai écris ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    WITH a AS (
        SELECT
            sends_id,
            COUNT(sends_id) AS n_total,
            CASE WHEN status = 'po' THEN 1 ELSE 0 END AS po
        FROM resource
        GROUP BY sends_id, status
    )
    SELECT sends_id, sum(po) AS n_ok, n_total
    FROM a
    GROUP BY sends_id, n_total;
    Résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     sends_id | n_total | n_ok
    --------------------+------
     119      | 2       | 0
     120      | 1       | 1
     121      | 1       | 1
    Ce qui ne passe pas c'est que les lignes avec 121 on 2 statuts différents.
    Je ne vois pas trop comment prendre en compte ceci...

    Une idée ?

    Merci

  2. #2
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Services à domicile

    Informations forums :
    Inscription : Septembre 2005
    Messages : 197
    Points : 121
    Points
    121
    Par défaut
    J'ai eu ma réponse ailleurs, la voici des fois que ça serve à quelqu'un d'autre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select
        sends_id,
        count(*) as total,
        count(*) filter (where status = 'po') as po
    from resource
    group by sends_id
    order by sends_id;

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Vous n'étiez pas très loin avec votre première syntaxe, il fallait directement agréger sur le case :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      select sends_id
           , count(*) as total
           , count(case status when 'po' then 1 end) as po
        from resource
    group by sends_id
    order by sends_id;
    Je pense d'ailleurs que le count filter de postgresql réécrit peu ou prou la requête ci-dessus.

  4. #4
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    C'est tout très bien: seulement
    - compter le nombre de ligne dont status = "po" et result = valeur non vide
    si on prend ce critère à la lettre, on peut le faire une petite élaboration comme ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select
        sends_id,
        count(*) as total,
        count(*) filter (where status = 'po' and result <> '') as po    -- not null inclu
    from resource
    group by sends_id
    order by sends_id;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème de comptage
    Par toxic_37 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 23/10/2007, 15h47
  2. Problème de comptage sur des dates
    Par Oberown dans le forum Langage SQL
    Réponses: 3
    Dernier message: 12/04/2007, 17h04
  3. Problème de comptage
    Par gunnm18 dans le forum Langage
    Réponses: 12
    Dernier message: 16/06/2006, 09h44
  4. [VBA-E]Problème de comptage
    Par Mirx1 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 24/05/2006, 10h25
  5. [MySql] Problème de comptage
    Par Oberown dans le forum Langage SQL
    Réponses: 3
    Dernier message: 13/02/2006, 05h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo