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
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 6
    Points : 3
    Points
    3
    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 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
    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 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
    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
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 6
    Points : 3
    Points
    3
    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 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
    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 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
    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