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 :

[Débutant] Alias - comptabiliser un total


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 [Débutant] Alias - comptabiliser un total
    Bonjour,

    J'ai un petit soucis. Cette requête fonctionne :

    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
    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 log.IMMEUBLE_ID_FK = imm.ID 
    WHERE log.NOMBRE_PIECE BETWEEN 1 AND 5
        AND imm.TYPE_STATUT_IMMEUBLE_ID_FK >= 3
    GROUP BY imm.NUMERO_DOSSIER
        , imm.LETTRE_DOSSIER
    ORDER BY imm.NUMERO_DOSSIER ASC
        , imm.LETTRE_DOSSIER ASC;
    Mais j'aimerais bien totaliser le résultat. J'ai essayé ceci, mais j'ai une erreur 1054 :

    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
    SELECT imm.NUMERO_DOSSIER
        , imm.LETTRE_DOSSIER
        , 1p, 2p, 3p, 4p, 5p
        , 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
        , 1p + 2p + 3p + 4p + 5p AS Total
    FROM IMMEUBLE AS imm
    JOIN LOGEMENT AS log
    ON log.IMMEUBLE_ID_FK = imm.ID
    WHERE log.NOMBRE_PIECE BETWEEN 1 AND 5
        AND imm.TYPE_STATUT_IMMEUBLE_ID_FK >= 3
    GROUP BY imm.NUMERO_DOSSIER
        , imm.LETTRE_DOSSIER
    ORDER BY imm.NUMERO_DOSSIER ASC
        , imm.LETTRE_DOSSIER ASC;
    Pouvez-vous m'aider ?

    Grand merci d'avance.
    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
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,

    les alias au niveau de la clause select sont effectifs apres que la clause soit construite.

    Du coup il vous ai impossible de les réutiliser directement a ce niveau là.


    il faut donc :
    - soit répéter les count
    - soit passer tout ceci dans une sous-requete / cte

  3. #3
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Où dans votre cas particulier, simplement faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    , COUNT(CASE WHEN log.NOMBRE_PIECE BETWEEN 1 AND 5 THEN log.NOMBRE_PIECE END) AS total

  4. #4
    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
    Effectivement, ceci fonctionne parfaitement :

    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 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
        , COUNT(CASE WHEN log.NOMBRE_PIECE BETWEEN 1 AND 5 THEN log.NOMBRE_PIECE END) AS total
    FROM IMMEUBLE AS imm
    JOIN LOGEMENT AS log
    ON log.IMMEUBLE_ID_FK = imm.ID 
    WHERE log.NOMBRE_PIECE BETWEEN 1 AND 5
        AND imm.TYPE_STATUT_IMMEUBLE_ID_FK >= 3
    GROUP BY imm.NUMERO_DOSSIER
        , imm.LETTRE_DOSSIER
    ORDER BY imm.NUMERO_DOSSIER ASC
        , imm.LETTRE_DOSSIER ASC;
    Merci beaucoup.

    Du coup, dans le même ordre d'idée, il va falloir que je fasse la somme d'un autre champ pour chaque nombre de pièces, puis essayer d'imbriquer les deux.

    Je regarde ça dès que j'ai un peu de temps et je sens déjà que je vais revenir ici (mais dans une nouvelle discussion).

    Merci encore.
    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

  5. #5
    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
    Ou même encore plus simple : count(*) pour le total.

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Ou même encore plus simple : count(*) pour le total.
    Effectivement, je n'avais pas vu le filtre dans le WHERE.

  7. #7
    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 Waldar,

    Merci pour ta réponse.

    Alors, actuellement, j'ai rajouté une somme des surfaces et un total de celles-ci :

    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
    SELECT imm.NUMERO_DOSSIER
        , imm.LETTRE_DOSSIER
        , COUNT(CASE log.NOMBRE_PIECE WHEN 1 THEN log.NOMBRE_PIECE END) AS 1p
        , COALESCE(ROUND(SUM(CASE log.NOMBRE_PIECE WHEN 1 THEN log.SURFACE_NETTE END), 2), 0) AS m2
        , COUNT(CASE log.NOMBRE_PIECE WHEN 2 THEN log.NOMBRE_PIECE END) AS 2p
        , COALESCE(ROUND(SUM(CASE log.NOMBRE_PIECE WHEN 2 THEN log.SURFACE_NETTE END), 2), 0) AS m2
        , COUNT(CASE log.NOMBRE_PIECE WHEN 3 THEN log.NOMBRE_PIECE END) AS 3p
        , COALESCE(ROUND(SUM(CASE log.NOMBRE_PIECE WHEN 3 THEN log.SURFACE_NETTE END), 2), 0) AS m2
        , COUNT(CASE log.NOMBRE_PIECE WHEN 4 THEN log.NOMBRE_PIECE END) AS 4p
        , COALESCE(ROUND(SUM(CASE log.NOMBRE_PIECE WHEN 4 THEN log.SURFACE_NETTE END), 2), 0) AS m2
        , COUNT(CASE log.NOMBRE_PIECE WHEN 5 THEN log.NOMBRE_PIECE END) AS 5p
        , COALESCE(ROUND(SUM(CASE log.NOMBRE_PIECE WHEN 5 THEN log.SURFACE_NETTE END), 2), 0) AS m2
        , COUNT(CASE WHEN log.NOMBRE_PIECE BETWEEN 1 AND 5 THEN log.NOMBRE_PIECE END) AS Nb_log
        , COUNT(*) AS Nb_log_2
        , COALESCE(ROUND(SUM(CASE WHEN log.NOMBRE_PIECE BETWEEN 1 AND 5 THEN log.SURFACE_NETTE END), 2), 0) AS Surface
        , COALESCE(ROUND(SUM(log.SURFACE_NETTE), 2), 0) AS Surface_2
    FROM IMMEUBLE AS imm
    JOIN LOGEMENT AS log
    ON log.IMMEUBLE_ID_FK = imm.ID 
    WHERE log.NOMBRE_PIECE BETWEEN 1 AND 5
        /*AND imm.TYPE_STATUT_IMMEUBLE_ID_FK >= 3*/
    GROUP BY imm.NUMERO_DOSSIER
        , imm.LETTRE_DOSSIER
    ORDER BY imm.NUMERO_DOSSIER ASC
        , imm.LETTRE_DOSSIER ASC;
    Et j'ai fait les totaux des deux façons.

    Il y en a une qui serait plus recommandable que l'autre ?
    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

  8. #8
    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
    La solution avec le CASE est un peu plus "ceinture et bretelles", en relisant l'expression on comprend ce qui se passe sans devoir aller regarder les filtres.
    La solution COUNT(*) et SUM(log.SURFACE_NETTE) va demander moins de CPU car il n'y a pas de case à évaluer.

    En toute honnêteté la différence sera négligeable : le mieux c'est d'utiliser la solution qui paraît la plus naturelle.

  9. #9
    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
    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: 12
    Dernier message: 11/10/2023, 17h14
  2. [Débutante] Alias de BDD...
    Par hanna dans le forum Bases de données
    Réponses: 2
    Dernier message: 18/02/2007, 19h05
  3. Réponses: 3
    Dernier message: 26/10/2006, 18h21
  4. Réponses: 1
    Dernier message: 19/02/2006, 19h52
  5. [VB.net] Piste pour Alias Macro (débutant)
    Par Petit padawan dans le forum Windows Forms
    Réponses: 3
    Dernier message: 26/07/2005, 20h17

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