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 dans une colonne et afficher les résultats en ligne [Débutant(e)]


Sujet :

Langage SQL

  1. #1
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 040
    Points
    16 040
    Par défaut Compter dans une colonne et afficher les résultats en ligne
    Bonjour,

    J'en suis toujours à faire de petits essais, avec une base de données MySQL.

    J'ai notamment une table `immeuble` et une table `logement` qui lui est rattachée.

    Dans la table `logement`, un champ NOMBRE_PIECE.

    Je désire obtenir le résultat suivant :

    1000 A 0 4 6 6 0
    etc..

    soit le numéro de l'immeuble, son extension, puis compter le nombre de logements par nombre de pièces, de une à cinq pièces.

    Après lecture et quelques recherches, j'ai écrit la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT imm.NUMERO_DOSSIER
        , imm.LETTRE_DOSSIER
        , COUNT(CASE NOMBRE_PIECE WHEN 1 THEN NOMBRE_PIECE END) as 1p
        , COUNT(CASE NOMBRE_PIECE WHEN 2 THEN NOMBRE_PIECE END) as 2p
        , COUNT(CASE NOMBRE_PIECE WHEN 3 THEN NOMBRE_PIECE END) as 3p
        , COUNT(CASE NOMBRE_PIECE WHEN 4 THEN NOMBRE_PIECE END) as 4p
        , COUNT(CASE NOMBRE_PIECE WHEN 5 THEN NOMBRE_PIECE END) as 5p    
    FROM immeuble as imm
    JOIN logement as log
    ON imm.ID = log.IMMEUBLE_ID_FK
    GROUP BY  imm.NUMERO_DOSSIER
        , imm.LETTRE_DOSSIER;
    Elle fonctionne parfaitement.

    Ce que je désire savoir, c'est si ma syntaxe est correcte, bien normalisée, éventuellement s'il est possible d'obtenir le même résultat différemment, quels en seraient les avantages, etc.

    Merci.
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

  2. #2
    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
    Certains SGBD intègrent une fonction PIVOT, mais la syntaxe ici utilisée est conforme à la norme SQL et fonctionnera partout.

    Je rajouterai simplement qu'il est bon ton de la liste des valeurs qu'on pivote dans le where :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE NOMBRE_PIECE BETWEEN 1 AND 5
    S'il y a une contrainte sur la colonne qui empêche toute autre valeur, ce filtre est inutile.

    Ah oui, il faut aussi utiliser les alias de tables dans les colonnes, ici NOMBRE_PIECE, je ne sais pas à quelle table elle appartient.
    Ça facilite les relectures, surtout quand on reprend un code d'autrui où même son propre code après plusieurs années.

    Sinon bravo !

  3. #3
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 040
    Points
    16 040
    Par défaut
    Bonjour,

    NOMBRE_PIECE appartient à la table `logement`.

    J'ai essayé de déclarer un alias, mais sans succès.
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

  4. #4
    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
    Ils y sont déjà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
      SELECT imm.NUMERO_DOSSIER
           , imm.LETTRE_DOSSIER
           , COUNT(CASE log.NOMBRE_PIECE WHEN 1 THEN log.NOMBRE_PIECE END) AS 1p
           , COUNT(CASE log.NOMBRE_PIECE WHEN 2 THEN log.NOMBRE_PIECE END) AS 2p
           , COUNT(CASE log.NOMBRE_PIECE WHEN 3 THEN log.NOMBRE_PIECE END) AS 3p
           , COUNT(CASE log.NOMBRE_PIECE WHEN 4 THEN log.NOMBRE_PIECE END) AS 4p
           , COUNT(CASE log.NOMBRE_PIECE WHEN 5 THEN log.NOMBRE_PIECE END) AS 5p    
        FROM immeuble AS imm
        JOIN logement AS log
          ON imm.ID = log.IMMEUBLE_ID_FK
       WHERE log.NOMBRE_PIECE between 1 and 5
    GROUP BY imm.NUMERO_DOSSIER
           , imm.LETTRE_DOSSIER;

  5. #5
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 040
    Points
    16 040
    Par défaut
    Ok.

    Je pensais encore pouvoir un peu simplifier en donnant d'abord un alias à log.NOMBRE_PIECE (vu que j'ai dix fois dans ma requête).

    Mais ça me va bien comme ça et du coup, je vais pouvoir passer à ma dernière question pour le moment.

    Merci beaucoup
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/07/2012, 11h25
  2. recherche dans une colonne pour changer les données
    Par cimbra55 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 26/03/2009, 16h49
  3. Compter dans une colonne
    Par leila84123 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 01/04/2008, 19h17
  4. Comment compter dans une colonne ce qui est unique
    Par pilpoil dans le forum Excel
    Réponses: 5
    Dernier message: 08/08/2007, 11h33
  5. Compter dans une colonne le nb de valeurs communes
    Par kenny49 dans le forum Requêtes
    Réponses: 3
    Dernier message: 23/04/2007, 14h48

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