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 :

Ajouter plusieurs count dans un select


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Inscrit en
    Juin 2010
    Messages
    366
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 366
    Points : 86
    Points
    86
    Par défaut Ajouter plusieurs count dans un select
    * Bonjour, *

    Je cherche à connaître les volumes de plusieurs colonnes dans une table.
    J'arrive bien à faire les comptages séparément mais il serait plus simple de tous les regrouper dans une même requête.

    Après avoir cherché sur internet, j'ai tenté quelque chose dans ce genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select count (*) as PRODUC.SFA_IT_SUIVI.ACLIB,
             count (case PRODUC.SFA_IT_SUIVI.ACVPND is not null then 1 end) as pre_affectation,
             count (case PRODUC.SFA_IT_SUIVI.ACTPRO is not null or PRODUC.SFA_IT_SUIVI.ACTPER is not null or PRODUC.SFA_IT_SUIVI.ACTPOR is not null then 1 end) as tel
             count (case PRODUC.SFA_IT_SUIVI.ACMAIL is not null then 1 end) as mail
    from PRODUC.SFA_IT_SUIVI
    where PRODUC.SFA_IT_SUIVI.ACLIB = 'NATIONALE VN'
    group by PRODUC.SFA_IT_SUIVI.ACLIB
    ;
    mais cela n'a bien évidemment pas fonctionné
    (message d'erreur: ORA-00923: mot-clé FROM absent à l'emplacement prévu)
    Est-ce que quelqu'un aurait la solution pour que je puisse obtenir un affichage dans ce genre :

    DATE FICHIER|N° COMMANDE|CAMPAGNE|VOLUME TOTAL|VOLUME PRE-AFFECTATION|% PRE-AFFECTATION|VOLUME TEL|% TEL|VOLUME MAILS|% MAILS
    L'idéal serait de pouvoir calculer directement dans la requête les % mais si cela n'est pas possible, je le ferai directement dans excel et je me contenterais donc de l'affichage suivant:

    DATE FICHIER|N° COMMANDE|CAMPAGNE|VOLUME TOTAL|VOLUME PRE-AFFECTATION|VOLUME TEL|VOLUME MAILS
    Merci d'avance pour vos réponses.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 920
    Points : 51 712
    Points
    51 712
    Billets dans le blog
    6
    Par défaut
    Utilisez les fonctions de fenêtrage :
    http://sqlpro.developpez.com/article...clause-window/

    A +

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 115
    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 115
    Points : 28 480
    Points
    28 480
    Par défaut
    Si cette requête est bien celle que tu tentes d'exécuter, elles contient plusieurs erreurs :
    • CASE doit être suivi de WHEN dans la syntaxe que tu utilises
    • Aux lignes 2, 3 et 4, il faudrait utiliser SUM plutôt que COUNT
    • Il manque une virgule entre les lignes 3 et 4

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur SQL
    Inscrit en
    Novembre 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur SQL
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 15
    Points : 52
    Points
    52
    Par défaut
    Essaye d’ajouter WHEN juste après CASE ?

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

    Votre message d'erreur vient probablement de l'absence de virgule avant le dernier COUNT dans le SELECT.

    Notez que vous pouvez par ailleurs simplifier ce select en remplaçant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    count (case PRODUC.SFA_IT_SUIVI.ACVPND is not null then 1 end) as pre_
    count (case PRODUC.SFA_IT_SUIVI.ACTPRO is not null or PRODUC.SFA_IT_SUIVI.ACTPER is not null or PRODUC.SFA_IT_SUIVI.ACTPOR is not null then 1 end) as tel
    count (case PRODUC.SFA_IT_SUIVI.ACMAIL is not null then 1 end) as mail
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    count (PRODUC.SFA_IT_SUIVI.ACVPND ) as pre_affectation,
    count (COALESCE(PRODUC.SFA_IT_SUIVI.ACTPRO , PRODUC.SFA_IT_SUIVI.ACTPER ,PRODUC.SFA_IT_SUIVI.ACTPOR)) as tel
    count (PRODUC.SFA_IT_SUIVI.ACMAIL ) as mail
    Pour ce qui et des pourcentages, cela reste du simple calcul, vous pouvez effectivement le faire dans la requête directement (en reprenant les COUNT, ou en passant votre requête actuelle en CTE ou requete en table dérivée afin de pouvoir utiliser les alias dans la requête finale), soit directement dans Excel, puis-qu’avec cette requête, vous avez touts les informations nécessaires me semble-t-il

  6. #6
    Membre régulier
    Inscrit en
    Juin 2010
    Messages
    366
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 366
    Points : 86
    Points
    86
    Par défaut
    Merci pour toutes vos réponses.

    J'ai donc essayé le dernière proposition:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select count (*) as PRODUC.SFA_IT_SUIVI.ACLIB,
    count (PRODUC.SFA_IT_SUIVI.ACVPND ) as pre_affectation,
    count (COALESCE(PRODUC.SFA_IT_SUIVI.ACTPRO , PRODUC.SFA_IT_SUIVI.ACTPER ,PRODUC.SFA_IT_SUIVI.ACTPOR)) as tel
    count (PRODUC.SFA_IT_SUIVI.ACMAIL ) as mail
    from PRODUC.SFA_IT_SUIVI
    where PRODUC.SFA_IT_SUIVI.ACLIB = 'NATIONALE VN'
    group by PRODUC.SFA_IT_SUIVI.ACLIB
    ;
    Mais je me retrouve avec l'erreur suivante ORA-00923: mot-clé FROM absent à l'emplacement prévu

  7. #7
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 115
    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 115
    Points : 28 480
    Points
    28 480
    Par défaut
    As-tu bien lu toutes les remarques qui t'ont été faites ?

  8. #8
    Membre régulier
    Inscrit en
    Juin 2010
    Messages
    366
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 366
    Points : 86
    Points
    86
    Par défaut
    Peut-être pas effectivement.
    J'ai encore modifié la requête mais j'obtiens toujours le même message d'erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select count (*) as PRODUC.SFA_IT_SUIVI.ACLIB,
             sum (case when PRODUC.SFA_IT_SUIVI.ACVPND is not null then 1 end) as pre_affectation,
             sum (case when PRODUC.SFA_IT_SUIVI.ACTPRO is not null or PRODUC.SFA_IT_SUIVI.ACTPER is not null or PRODUC.SFA_IT_SUIVI.ACTPOR is not null then 1 end) as tel,
             sum (case when PRODUC.SFA_IT_SUIVI.ACMAIL is not null then 1 end) as mail
    from PRODUC.SFA_IT_SUIVI
    where PRODUC.SFA_IT_SUIVI.ACLIB = 'NATIONALE VN'
    group by PRODUC.SFA_IT_SUIVI.ACLIB
    ;

  9. #9
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 115
    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 115
    Points : 28 480
    Points
    28 480
    Par défaut
    Je ne suis pas certain que le nom d'alias utilisé à la ligne 1 soit valide.
    Sinon, la requête postée au message #6 était presque correcte, si ce n'est l'absence de virgule entre les lignes 3 et 4

  10. #10
    Membre régulier
    Inscrit en
    Juin 2010
    Messages
    366
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 366
    Points : 86
    Points
    86
    Par défaut
    Il y avait effectivement un problème avec l'alias.

    Ci-dessous la version finale qui fonctionne parfaitement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select PRODUC.SFA_IT_SUIVI.ACDAT, PRODUC.SFA_IT_SUIVI.ACCMD, PRODUC.SFA_IT_SUIVI.ACLIB, count (*),
    count (PRODUC.SFA_IT_SUIVI.ACVPND ) as pre_affectation,
    count (COALESCE(PRODUC.SFA_IT_SUIVI.ACTPRO , PRODUC.SFA_IT_SUIVI.ACTPER ,PRODUC.SFA_IT_SUIVI.ACTPOR)) as tel,
    count (PRODUC.SFA_IT_SUIVI.ACMAIL ) as mail
    from PRODUC.SFA_IT_SUIVI
    where PRODUC.SFA_IT_SUIVI.ACDAT = '20170330'
    group by PRODUC.SFA_IT_SUIVI.ACDAT, PRODUC.SFA_IT_SUIVI.ACCMD, PRODUC.SFA_IT_SUIVI.ACLIB
    order by PRODUC.SFA_IT_SUIVI.ACCMD
    ;
    Merci à tout le monde.

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

Discussions similaires

  1. Plusieurs Count dans mon select
    Par thomfort dans le forum Requêtes
    Réponses: 1
    Dernier message: 16/03/2007, 18h39
  2. [Formulaire] Comment permettre de faire plusieurs choix dans un select ?
    Par JackBeauregard dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 29/12/2006, 22h58
  3. comment ajouter un surlignage dans un select
    Par amatollah dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 05/10/2006, 09h51
  4. PLusieurs COUNT dans une requete?
    Par haludo dans le forum Access
    Réponses: 3
    Dernier message: 04/10/2006, 11h38
  5. evenement à l'ajout de données dans un select
    Par mohican13 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 01/03/2006, 16h10

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