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

 Oracle Discussion :

[Oracle] Deux COUNT dans une seule requête


Sujet :

Oracle

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 6
    Par défaut [Oracle] Deux COUNT dans une seule requête
    Bonjour,

    Voilà mon problème, pour un cours, je dois écrire une requête SQL qui renvoie 2 colonnes. La première colonne affichera le nombre d'articles qui ont été commandé 6+ fois et la deuxième colonnes, les articles qui ont été commandé moins de 2 fois.

    La requête qui permet d'avoir le nombre de fois que chaque article à été commandé est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT noArticle, CASE WHEN SUM(quantite) IS NULL THEN 0 ELSE SUM(quantite) END AS quantiteTotale 
    FROM Article NATURAL LEFT OUTER JOIN LigneCommande 
    GROUP BY noArticle


    Maintenant, je ne sais plus trop quoi faire pour pouvoir afficher mes 2 colonnes. J'ai essayé ceci, mais j'obtiens seulement une colonne (articlesImpopulaires) avec 2 lignes au lieu de 2 colonnes avec une lignes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT COUNT(*) AS articlesImpopulaires 
    FROM 
         (SELECT noArticle 
          FROM Article NATURAL LEFT OUTER JOIN LigneCommande 
          GROUP BY noArticle 
          HAVING CASE WHEN SUM(quantite) IS NULL THEN 0 ELSE SUM(quantite) END < 2) 
          UNION 
          SELECT COUNT(*) AS articlesPopulaires 
          FROM 
         (SELECT noArticle FROM Article NATURAL LEFT OUTER JOIN LigneCommande GROUP BY noArticle 
          HAVING  SUM(quantite) > 5)


    La sortie devrait être comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    NOMBREPOPULAIRES NOMBREIMPOPULAIRES                                             
    -------------- -----------------                                            
              3                  4

    mais moi j'obtiens ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    NOMBREIMPOPULAIRES                                              
    ------------------                                             
              3                  
              4

    Merci à l'avance

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 454
    Par défaut
    Comme vous débutez voici deux conseils.

    N'utilisez JAMAIS le natural join. A moins d'aller regarder le modèle on ne sait pas ce qui se passe.
    Impossible pour un lecteur (dans le cas présent, moi-même) d'avoir une idée de ce qui se trame derrière.

    Dès qu'une requête interroge plus d'une table, utilisez TOUJOURS des alias, ou à minima préfixez vos colonnes avec le noms des tables.
    Toujours en relecture, sans avoir le modèle, impossible de savoir qui appartient à quoi.

    Vous ne devez pas connaître, mais des fonctions existent spécifiquement pour gérer les nulls, regardez les fonctions suivantes : nvl, coalesce, nvl2, nullif.

    Votre première requête s'écrirait donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT
        art.noArticle,
        coalesce(sum(lco.quantite), 0) AS quantiteTotale 
    FROM
        Article art
        LEFT OUTER JOIN LigneCommande lco
          ON lco.IdArticle = art.IdArticle -- A vérifier donc
    GROUP BY
        art.noArticle

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 454
    Par défaut
    Pour votre exercice, une fois votre quantité connue vous pouvez directement appliquer une fonction dessus, et refaire un agrégat ensuite.

    Pour vous aider, tout ce qu'il y a en-dessous du FROM n'a pas besoin d'être modifié, tout se passe au niveau du SELECT.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 6
    Par défaut
    Merci bien Waldar, j'ai réussi mon exercice

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 454
    Par défaut
    N'hésitez pas à écrire votre solution !

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 454
    Par défaut
    Je mets la mienne :
    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
    WITH Article AS
    (
    select 1 as IdArticle, 'Article 1' as noArticle from dual union all
    select 2             , 'Article 2'              from dual union all
    select 3             , 'Article 3'              from dual union all
    select 4             , 'Article 4'              from dual union all
    select 5             , 'Article 5'              from dual
    )
    ,    LigneCommande AS
    (
    select 1 as lcoid, 1 as IdArticle, 3 as quantite from dual union all
    select 2         , 1             , 2             from dual union all
    select 3         , 2             , 0             from dual union all
    select 4         , 5             , 1             from dual union all
    select 5         , 4             , 2             from dual union all
    select 6         , 4             , 7             from dual
    )
    select
        sum(case when coalesce(sum(lco.quantite), 0) < 2 then 1 else 0 end) as NOMBREIMPOPULAIRES,
        sum(case when coalesce(sum(lco.quantite), 0) > 5 then 1 else 0 end) as NOMBREPOPULAIRES
    from
        article art
        left outer join lignecommande lco
          on lco.idarticle = art.idarticle
    group by
        art.noarticle;
     
    NOMBREIMPOPULAIRES	NOMBREPOPULAIRES
    3			1

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 24/10/2011, 11h07
  2. Deux requêtes dans une seule requête, est-ce possible ?
    Par Stephane_br dans le forum Développement
    Réponses: 3
    Dernier message: 08/07/2011, 15h35
  3. requête sql qui joint deux champs dans une seule chaine
    Par marwacht dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 24/05/2011, 10h29
  4. Deux COUNT dans une seule requête
    Par aya02 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/07/2010, 10h17
  5. [MySQL] Deux COUNT dans une requête
    Par ecchymose dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 05/07/2007, 23h24

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