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

Langage SQL Discussion :

Compter différentes valeur d'une table


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    314
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 314
    Points : 98
    Points
    98
    Par défaut Compter différentes valeur d'une table
    Je cherche à compter les enregistrements d'une table en fonction de 2 caractéristiques.

    Cas n°1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select count(*) from matable WHERE condition1 = 1 and condition2 = 2
    Cas n°2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select count(*) from matable WHERE condition1 = 1 and condition2 = 4
    Cas n°3 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select count(*) from matable WHERE condition1 = 1 and condition2 = 4
    j'aimerais récupérer toutes ces quantité sans devoir effectuer 3 requettes ... est ce possible ?


    merci

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Oui vous pouvez faire ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select condition1, condition2, count(*)
    from matable
    group by condition1, condition2

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    314
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 314
    Points : 98
    Points
    98
    Par défaut
    Je ne vois pas trop comment procéder peut être je n'ai pas été assez précis.

    Voici mes requettes précise :
    Requette 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT count(*) 
    from developph_marchands_cp 
    WHERE TO_DAYS( now( ) ) - TO_DAYS( datefin ) < 1 
    AND (CAT = '1' OR CAT = '2' OR CAT ='0')
    Requette 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT count(*) 
    from developph_marchands_cp 
    WHERE TO_DAYS( now( ) ) - TO_DAYS( datefin ) < 1 
    AND CAT >= '4' AND CAT <= '16'
    Requette 3 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT count(*) 
    from developph_marchands_cp 
    WHERE TO_DAYS( now( ) ) - TO_DAYS( datefin ) < 1 
    AND CAT = 0
    Etc ...

    je ne vois pas comment tout combiner en une requête en pratiquant ta mise en forme ...

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Au temps pour moi, votre syntaxe m'avait amené à penser que condition1 était un champ.

    Dans vos requête, le champ CAT est-il numérique ?
    Si oui, il ne faut pas utiliser d'apostrophes pour préciser la valeur.

    Vous pouvez faire ainsi (je suppose que CAT est numérique) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT
        case when CAT in (0, 1, 2) then 'DANS {0,1,2}' else null end as cas1,
        case when CAT between 4 and 16 then 'ENTRE 4 ET 16' else null end as cas2,
        case when CAT = 0 then 'EGAL A 0' else null end as cas3,
        count(*)
    from developph_marchands_cp
    WHERE TO_DAYS( now( ) ) - TO_DAYS( datefin ) < 1
    GROUP BY
        case when CAT in (0, 1, 2) then 'DANS {0,1,2}' else null end,
        case when CAT between 4 and 16 then 'ENTRE 4 ET 16' else null end,
        case when CAT = 0 then 'EGAL A 0' else null end

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    314
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 314
    Points : 98
    Points
    98
    Par défaut
    Yes c'est un numérique .... autant pour moi aussi pour les apostrophes !

    Dans tous les cas ta requette à l'air de fonctionner !!

    Vous êtes balaise les mecs quand même, je sais pas comment vous faite !

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    314
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 314
    Points : 98
    Points
    98
    Par défaut
    Juste un dernier petit truc quand je n'ai pas de résultat dans ma requette je n'ai pas de valeur 0, ce qui fait varier la taille de mon tableau et ne me permet pas d'afficher les données sous cette forme echo $res[x][y]

    Vous avez peut etre une astuce ?

  7. #7
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 109
    Points : 28 437
    Points
    28 437
    Par défaut
    Pour obtenir un comptage à 0 sur des données absentes, il faut effectuer une jointure externe, sur une table de référence que je construis ici à la volée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    SELECT    lst.libcas
        ,    COUNT(*)    AS nb
    FROM    (    SELECT    1    AS cas
                    ,    'DANS {0,1,2}'    AS libcas
                FROM    DUAL
            UNION ALL
                SELECT    2    AS cas
                    ,    'ENTRE 4 ET 16'    AS libcas
                FROM    DUAL
            UNION ALL
                SELECT    3    AS cas
                    ,    'EGAL A 0'    AS libcas
                FROM    DUAL
            )    AS lst
        LEFT JOIN
            developph_marchands_cp    AS dmc
            ON    (CASE WHEN dmc.cat IN (0, 1, 2) 
                    THEN 1
                WHEN dmc.cat BETWEEN 4 AND 16
                    THEN 2
                WHEN dmc.cat = 0 
                    THEN 3
                ELSE 
                    NULL 
                END)    = lst.cas 
    WHERE    TO_DAYS(NOW()) - TO_DAYS(dmc.datefin) < 1
    GROUP BY lst.libcas
    ;
    A noter que le cas 3 ne se rencontre pas puisqu'il est inclus dans le cas 1.

    Ce problème pourrait aussi se résoudre avec une table de paramétrage qui donnerait la correspondance entre la valeur de cat et le code de regroupement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    CREATE TABLE corresp
    AS    (    SELECT    1    AS grp
                    0    AS cat
                FROM    DUAL
        UNION ALL
            SELECT    1    AS grp
                    1    AS cat
                FROM    DUAL
        UNION ALL
            SELECT    1    AS grp
                    2    AS cat
                FROM    DUAL
        UNION ALL
            SELECT    2    AS grp
                    4    AS cat
                FROM    DUAL
        UNION ALL
            SELECT    2    AS grp
                    5    AS cat
                FROM    DUAL
        ...
        UNION ALL
            SELECT    2    AS grp
                    15    AS cat
                FROM    DUAL
        UNION ALL
            SELECT    2    AS grp
                    16    AS cat
                FROM    DUAL
        UNION ALL
            SELECT    3    AS grp
                    0    AS cat
                FROM    DUAL
        )
    ;
    L'avantage d'une telle table est qu'elle peut évoluer à la demande.

    La requête est plus simple, permet d'affecter deux codes de regroupement à une même valeur de cat et peut même être étendue pour prendre en compte les cas non prévus dans la table de correspondance
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT    COALESCE(lst.grp, 'inconnu') AS cas
        ,    COUNT(*)    AS nb
    FROM    corresp    AS lst
        FULL OUTER JOIN
            developph_marchands_cp    AS dmc
            ON    dmc.cat    = lst.cat 
    WHERE    TO_DAYS(NOW()) - TO_DAYS(dmc.datefin) < 1
    GROUP BY lst.grp
    ;

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    314
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 314
    Points : 98
    Points
    98
    Par défaut
    Ho my god ! ca devient compliqué la !

    je crois que je vais tester en PHP en fonction du AS 'NOM'

    si y'a pas c'est que c'est à 0 non ?

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

Discussions similaires

  1. [AC-2003] Compter des valeurs dans une table
    Par jmde dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 13/11/2013, 19h50
  2. Réponses: 7
    Dernier message: 12/07/2013, 16h24
  3. [AC-2007] Compter les valeurs d'une table dans un formulaire
    Par redwarf dans le forum Requêtes et SQL.
    Réponses: 10
    Dernier message: 01/11/2009, 19h57
  4. Réponses: 3
    Dernier message: 13/12/2006, 18h05
  5. Mettre la valeur d'une table dans une CString
    Par Lucier dans le forum MFC
    Réponses: 29
    Dernier message: 26/11/2004, 16h04

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