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

SQL Oracle Discussion :

mélanger group by et distinct


Sujet :

SQL Oracle

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Par défaut mélanger group by et distinct
    Bonjour,
    Si j'ai le schéma suivant :


    je veux connaitre le poids total de mes vélo appartenant aux categories cat1 et cat2.
    J'exécute donc la requete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select id_velo,sum(poids)
    from velo,appartient,categorie
    where velo.id_velo=appartient.id_velo
    and appartient.id_categorie=categorie.id_categorie
    and lib_categorie in ('cat1','cat2')
    group by id_velo
    le probleme est que si un vélo appartient à la categorie cat1 et cat2, il sort deux fois, et son poids sera au total compté double. la est le probleme.
    Tata

  2. #2
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Salut !

    Si j'ai bien compris :
    Tu veux le poids de chaque velo.
    Dans la table velo, id_velo est l'identifiant. Donc à priori, il n'y a dans cette table qu'un seul poids pour un velo. Tu n'as donc à priori pas besoin de GROUP BY.

    Ton seul problème est donc de limiter la requête à des catégories.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT id_velo, poids
    FROM velo a
    WHERE EXISTS (SELECT NULL
                          FROM appatient b 
                            JOIN categorie c ON b.id_categorie = c.id_categorie
                         WHERE b.id_velo = a.id_velo
                             AND c.libelle IN ('cat1','cat2'))

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Par défaut
    merci de ta réponse.

    n'y a t'il pas une autre possibilité ? je pense que je ne peux pas implémenter ta solution. (en fait la requete va etre générée avec business objects).

    peut etre avec un case dans le select ?

  4. #4
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Si tu gardes ta première formule (avec group by), tu peux simplement diviser par count(*)

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Par défaut
    Effectivement...
    Je vais voir si ca peut convenir à mon cas.
    Merci de ton aide.

  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
    Vous pouvez générer des sous requêtes avec BO, du type :
    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
    SELECT
        id_velo,
        poids
    FROM
        velo
    WHERE
        id_velo IN
        (SELECT
             b.id_velo 
         FROM
             appartient b 
             INNER JOIN categorie c
               ON b.id_categorie = c.id_categorie
         WHERE
             c.libelle IN ('cat1', 'cat2'))
    C'est presqu'aussi bien que le exists, et plus propre que la division par count(*) !

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Par défaut
    effectivement, mais les utilisateurs de l'univers ne maitrisent pas tous assez bien pour utiliser les sous requetes dans BO (deski), et surtout pour comprendre et intégrer le fait qu'il faille utiliser des sous requetes. ils sont chiants quoi...

  8. #8
    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
    Considérez le rapport comme étant complexe et publiez-le vous-même avec quelques critères d'interrogation.
    BO c'est très bien mais il faut quand même limiter la création d'état par les utilisateurs aux requêtes les plus simples, les plus complexes et/ou réutilisables doivent être, à mon avis, fournies par le service informatique.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Par défaut
    Dans quel cas pensez vous que la division par count(*) puisse poser problème ?

  10. #10
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Vu les cardinalités de tes relations, je dirais : aucun !

  11. #11
    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
    Sur cet exemple-ci pas de problème, mais le jour où vous ferez une requête similaire avec une jointure externe ça risque d'être différent.

  12. #12
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    C'est sûr que le procédé en soit est douteux...
    ... mais tant qu'il count l'* et non une colonne potentiellement null, il arrivera toujours au moins à 1

  13. #13
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    je veux connaitre le poids total de mes vélo appartenant aux categories cat1 et cat2.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select UNIQUE id_velo,poids
    from velo,appartient,categorie
    where velo.id_velo=appartient.id_velo
    and appartient.id_categorie=categorie.id_categorie
    and lib_categorie in ('cat1','cat2')
    Ou est le piège?

Discussions similaires

  1. Group by ou Distinct ?
    Par Florian54 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 15/12/2014, 10h57
  2. Problème de group by ou distinct
    Par Stephane_br dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 02/09/2011, 21h24
  3. Requête avec des groupes de conditions distincts
    Par abdelhamidem dans le forum SQL
    Réponses: 2
    Dernier message: 08/03/2011, 18h00
  4. Distinct, group by et order by
    Par gloubi dans le forum Langage SQL
    Réponses: 8
    Dernier message: 27/11/2006, 16h53
  5. Problème requête avec group by et distinct
    Par tomca dans le forum Langage SQL
    Réponses: 2
    Dernier message: 20/07/2005, 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