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 des éléments par "objets", puis en faire la somme [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 044
    Points
    16 044
    Par défaut Compter des éléments par "objets", puis en faire la somme
    Bonjour,

    Cette discussion fait suite à celle-ci qui est résolue.

    J'obtiens bien une liste d'immeubles (mes "objets"), pour chaque année voulue.

    2000 1000 A
    2000 1001 A
    2001 1000 A
    2001 1001 A
    2001 1002 A
    2002 1000 A
    2002 1001 A
    2002 1002 A
    2002 1003 A
    2003 1000 A
    2003 1002 A
    2003 1003 A
    2004 1000 A
    2004 1002 A
    2004 1004 A

    Maintenant, je désire compter le nombre de logements qui leurs sont rattachés, de manière à obtenir ceci :

    2000 1000 A 25
    2000 1001 A 36
    2001 1000 A 25
    2001 1001 A 36
    2001 1002 A 18
    2002 1000 A 25
    2002 1001 A 36
    2002 1002 A 18
    2002 1003 A 12
    2003 1000 A 25
    2003 1002 A 18
    2003 1003 A 12
    2004 1000 A 25
    2004 1002 A 18
    2004 1004 A 30

    puis dans un deuxième temps, faire la somme des logements par année :

    2000 61
    2001 79
    etc...

    J'ai modifié la requête précédente comme ceci, afin de déjà obtenir le nombre de logements par immeubles :

    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
    SELECT cal.ANNEE_REF
        , EXTRACT(YEAR FROM imm.DATE_DEBUT)  AS ANNEE_DEBUT
        , EXTRACT(YEAR FROM imm.DATE_SORTIE) AS ANNEE_FIN
        , imm.NUMERO_DOSSIER
        , imm.LETTRE_DOSSIER
        , imm.TYPE_STATUT_IMMEUBLE_ID_FK
        , COUNT(log.ID) AS NB_LOG
    FROM (SELECT DISTINCT  EXTRACT(YEAR FROM DATE) AS ANNEE_REF FROM ipc) AS cal
    JOIN immeuble AS imm
    ON cal.ANNEE_REF >= EXTRACT(YEAR FROM imm.DATE_DEBUT)
        AND (cal.ANNEE_REF <=  EXTRACT(YEAR FROM imm.DATE_SORTIE) OR  EXTRACT(YEAR FROM imm.DATE_SORTIE) IS NULL)
    INNER JOIN logement AS log
    ON imm.ID = log.IMMEUBLE_ID_FK
    WHERE imm.TYPE_STATUT_IMMEUBLE_ID_FK >= 3
    ORDER BY cal.ANNEE_REF ASC
        , imm.NUMERO_DOSSIER ASC
        , imm.LETTRE_DOSSIER ASC;
    en ajoutant les lignes 7, 12 et 13.

    Je n'ai pas d'erreur, mais je n'obtiens pas le résultat souhaité, qui est :

    1998 1000 A 146170

    soit une seule ligne.

    Pouvez-vous m'aider à corriger cette requête ?

    Merci d'avance.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 240
    Points : 12 872
    Points
    12 872
    Par défaut
    Bonjour,
    Il manque la clause GROUP BY dans la requête.

    Tatayo.

  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 044
    Points
    16 044
    Par défaut
    Bonjour Tatayo,

    Et merci.

    Effectivement, cette requête donne bien le résultat attendu :

    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
    SELECT cal.ANNEE_REF
        , EXTRACT(YEAR FROM imm.DATE_DEBUT)  AS ANNEE_DEBUT
        , EXTRACT(YEAR FROM imm.DATE_SORTIE) AS ANNEE_FIN
        , imm.NUMERO_DOSSIER
        , imm.LETTRE_DOSSIER
        , imm.TYPE_STATUT_IMMEUBLE_ID_FK
        , COUNT(log.ID) AS NB_LOG
    FROM (SELECT DISTINCT  EXTRACT(YEAR FROM DATE) AS ANNEE_REF FROM ipc) AS cal
    JOIN immeuble AS imm
    ON cal.ANNEE_REF >= EXTRACT(YEAR FROM imm.DATE_DEBUT)
        AND (cal.ANNEE_REF <=  EXTRACT(YEAR FROM imm.DATE_SORTIE) OR  EXTRACT(YEAR FROM imm.DATE_SORTIE) IS NULL)
    INNER JOIN logement AS log
    ON imm.ID = log.IMMEUBLE_ID_FK
    WHERE imm.TYPE_STATUT_IMMEUBLE_ID_FK >= 3
    GROUP BY cal.ANNEE_REF
        , imm.ID
    ORDER BY cal.ANNEE_REF ASC
        , imm.NUMERO_DOSSIER ASC
        , imm.LETTRE_DOSSIER ASC;
    Je m'attaque à la dernière partie cet après-midi.

  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 386
    Points
    18 386
    Par défaut
    Attention, MySQL est permissif sur le GROUP BY, mais la façon de l'utiliser dans tous les autres SGBD est que l'ensemble des colonnes de la clause SELECT doit être inclus dans l'ensemble des colonnes de la clause GROUP BY.

    Dès lors, il faut écrire 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
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
      SELECT cal.ANNEE_REF
           , EXTRACT(YEAR FROM imm.DATE_DEBUT)  AS ANNEE_DEBUT
           , EXTRACT(YEAR FROM imm.DATE_SORTIE) AS ANNEE_FIN
           , imm.NUMERO_DOSSIER
           , imm.LETTRE_DOSSIER
           , imm.TYPE_STATUT_IMMEUBLE_ID_FK
           , COUNT(log.ID) AS NB_LOG
        FROM (SELECT DISTINCT EXTRACT(YEAR FROM DATE) AS ANNEE_REF FROM ipc) AS cal
        JOIN immeuble AS imm
          ON cal.ANNEE_REF >= EXTRACT(YEAR FROM imm.DATE_DEBUT)
         AND (cal.ANNEE_REF <= EXTRACT(YEAR FROM imm.DATE_SORTIE) OR imm.DATE_SORTIE IS NULL)
        JOIN logement AS log
          ON log.IMMEUBLE_ID_FK = imm.ID
       WHERE imm.TYPE_STATUT_IMMEUBLE_ID_FK >= 3
    GROUP BY cal.ANNEE_REF
           , EXTRACT(YEAR FROM imm.DATE_DEBUT)
           , EXTRACT(YEAR FROM imm.DATE_SORTIE)
           , imm.NUMERO_DOSSIER
           , imm.LETTRE_DOSSIER
           , imm.TYPE_STATUT_IMMEUBLE_ID_FK
    ORDER BY cal.ANNEE_REF      ASC
           , imm.NUMERO_DOSSIER ASC
           , imm.LETTRE_DOSSIER ASC;
    Pour les totaux, il "suffit" de retirer les colonnes dont on n'a plus besoin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      SELECT cal.ANNEE_REF
           , COUNT(log.ID) AS NB_LOG
        FROM (SELECT DISTINCT EXTRACT(YEAR FROM DATE) AS ANNEE_REF FROM ipc) AS cal
        JOIN immeuble AS imm
          ON cal.ANNEE_REF >= EXTRACT(YEAR FROM imm.DATE_DEBUT)
         AND (cal.ANNEE_REF <= EXTRACT(YEAR FROM imm.DATE_SORTIE) OR imm.DATE_SORTIE IS NULL)
        JOIN logement AS log
          ON log.IMMEUBLE_ID_FK = imm.ID
       WHERE imm.TYPE_STATUT_IMMEUBLE_ID_FK >= 3
    GROUP BY cal.ANNEE_REF
    ORDER BY cal.ANNEE_REF ASC;

  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 044
    Points
    16 044
    Par défaut
    Bonjour Waldar,

    Citation Envoyé par Waldar Voir le message
    Pour les totaux, il "suffit" de retirer les colonnes dont on n'a plus besoin :
    Effectivement, pourquoi faire simple quand on peut faire compliqué :aie.

    Mais l'exercice n'est pas totalement inutile, cela m'a permis de comprendre deux ou trois choses, et pouvoir afficher le détail annuel immeuble par immeuble me permettra de valider cette statistique plus facilement (de mémoire, il y a quelques dizaines de logements d'écart avec la stat tenue actuellement avec Excel).

    Je te remercie pour le temps consacré et les nombreuses précisions apportées sur ces deux discussions, c'est vraiment apprécié

    Il me reste à me plonger dans le SQL, ce ne devrait pas être trop difficile de trouver des tutos, il y en a quantité d'excellents sur DVP.

    Domi2

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

Discussions similaires

  1. Réponses: 22
    Dernier message: 04/04/2007, 15h24
  2. [MySQL] compter des éléments
    Par ggeorges dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 24/03/2007, 10h00
  3. compter des enregistrement par SQL
    Par 973thom dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 22/11/2004, 18h26

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