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 :

Utilisation des fonctions d'aggregation, sans aggreger les sorties


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 144
    Points : 97
    Points
    97
    Par défaut Utilisation des fonctions d'aggregation, sans aggreger les sorties
    Bonjour,

    La réponse à ma question se touve peut-être dans un des threads de ce forum mais étant donné qu'ils sont tous nommés "Problème requete sql" je n'ai pas eu le courage de tous les lire.

    Je souhaite utiliser une fonction d'aggregation sur une jointure interne, sans pourtant vouloir afficher mes données de manière aggrégées. Un exemple parlera certainement plus:

    Supposons que nous avons deux tables RESPONSABLE et MAGASIN. Une row de RESPONSABLE peut posseder jusqu'à n liens avec différentes row de MAGASIN. (A travers en réalité une troisième table de liaison). Ayant récupéré un select qui renvoie les liens RESPONSABLE-MAGASIN sous ses deux mêmes colonnes (avec une entrée pour chaque lien de chaque responsable), je peux avoir le nombre de lien par responsable en faisant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select RESPONSABLE,count(1) from
    (Mon select sur table de liens)
    group by RESPONSABLE
    comment puis-je faire pour obtenir un select sur RESPONSABLE,MAGASIN,count(1) pour savoir à chaque ligne combien de magasin le RESPONSABLE possède même si la ligne en affiche un seul?

    Je précise qu'étant sous Oracle, celà est impossible tel quel. (Je ne sais plus si c'est la norme SQL qui le veut mais je me souviens d'un tuto developpez qui parlait de ça sous d'autre SGDB).

    Merci par avance,
    LDPDC

  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
    Pouvez-vous clarifier votre exemple avec un petit jeu de données (deux responsables, trois magasins) et ce que vous attendez ?

    Je ne perçois rien d'insurmontable toutefois.

  3. #3
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Ce genre de requete peut peut etre vous aider.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select 
       b.lib,
       sum (case when(a.id_mag is null) then 0 else 1 end) as "Nombre de magasins" 
    from RESPMAG a 
        right outer join 
            RESPONSABLE b on (a.id_resp=b.id) group by b.id
    ou RESPMAG est votre 3eme table de liaison

    A Adapter et tester.

    Bon courage

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Bonjour,

    Citation Envoyé par LDPDC Voir le message
    comment puis-je faire pour obtenir un select sur RESPONSABLE,MAGASIN,count(1) pour savoir à chaque ligne combien de magasin le RESPONSABLE possède même si la ligne en affiche un seul?
    Si j'ai bien compris, tu auras ce que tu souhaites en faisant ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select 
         RESPONSABLE,
         MAGASIN,
         count(MAGASIN) OVER (PARTITION BY RESPONSABLE) AS NbMagasinParResponsable 
    from
    (Ton select sur table de liens)

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 144
    Points : 97
    Points
    97
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Pouvez-vous clarifier votre exemple avec un petit jeu de données (deux responsables, trois magasins) et ce que vous attendez ?

    Je ne perçois rien d'insurmontable toutefois.
    Un petit exemple plus précis:

    (Je reprends RESPMAG comme table de liaison)

    RSEPMAG
    ID_RES | ID_MAG
    1 | 1
    2 | 2
    3 | 3
    1 | 4

    MAGASIN
    ID_MAG | AUTRES colonnes
    1 | blabla
    2 | blabla
    3 | blabla
    4 | blabla

    RESPONSABLE
    ID_RES | AUTRES colonnes
    1 | blabla
    2 | blabla
    3 | blabla

    Ce que je veux obtenir en sortie:
    RESPONSABLE | MAGASIN | Count
    1 | 1 | 2
    2 | 2 | 1
    3 | 3 | 1
    1 | 4 | 2

    Je n'ai pas encore pu tester vos solutions mais elles me semblent correspondre à ce que j'attend, celle de Snipah me semble plus claire (à lire) mais je vais aussi regarder la plus rapide.
    Merci beaucoup de votre aide et si quelqu'un à une solution plus rapide/plus élégante, n'hésitez pas, je suis nouveau sur le SQL et tout m'interresse.

    Cordialement,
    LDPDC

  6. #6
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Voici la requete qui devrait vous convenir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select ST1.id, c.id_mag,ST1.MyCount from 
    (select b.lib,b.id,
    	sum (case when(a.id_mag is null) then 0 else 1 end) as MyCount
    from RESPMAG a 
       right outer join RESPONSABLE b on (a.id_resp=b.id) group by b.id )  ST1
     left outer join RESPMAG c on (c.id_resp=ST1.id) order by 2
    Attention a bien gerer le fait qu'un responsable peut ne pas etre lié a un magasin (et donc afficher 0 dans le nbre de magasin géré) (edité pour cela)

    Bon courage

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 31/05/2008, 16h27
  2. Réponses: 3
    Dernier message: 15/05/2008, 21h29
  3. [hibernate] utilisation des fonctions d'aggregation
    Par osopardo dans le forum Hibernate
    Réponses: 2
    Dernier message: 29/08/2005, 09h41
  4. utilisation des fonctions d'une dll
    Par jackk dans le forum C++
    Réponses: 14
    Dernier message: 15/06/2005, 16h50
  5. Utiliser des fonctions Pascal
    Par Neilos dans le forum C++Builder
    Réponses: 2
    Dernier message: 07/03/2004, 15h43

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