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 :

Ajouter une colonne de sous-requête dans le Group By


Sujet :

SQL Oracle

  1. #1
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Points : 5 059
    Points
    5 059
    Par défaut Ajouter une colonne de sous-requête dans le Group By
    Bonjour,

    J'ai une requete avec un groupBy, je voudrais ajouter le résultat d'une sous requete dans la liste de group by, mais ça ne marche pas comme ça, je suis obligé d'utiliser la sous requete, parce que un join peut me retourner plusieurs lignes alors que je voudrais juste le champ en question (une ligne).

    voilà ma requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT to_char(trunc(t.CREATED_DATE),'YYYY-MM') as Month,
    t.NUMBER
    t.ACCOUNT as ACCOUNT,
    (SELECT  C.NAME  from  scm.company c,scm.person per where per.company_id = c.company_id and c.region='5' and c.uid = t.userID) as CUSTOMER,
     
    Count(1) as  No, 
    sum(t.qty) as SumOfQty
     
     FROM cm.company_order t 
     
    where t.created_date > to_date('2012-04-01','YYYY-MM-DD')
    Group BY to_char(trunc(t.CREATED_DATE),'YYYY-MM'),t.NUMBER ,t.ACCOUNT

  2. #2
    Membre averti
    Avatar de sweetasnz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2012
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2012
    Messages : 212
    Points : 375
    Points
    375
    Par défaut
    pour restreindre les réponses hors sujets,
    Est-il possible d'avoir un petit jeu de données et le résultat escompté?

    As-tu une erreur ou juste de mauvais résultats?
    As-tu tenté de rajouter "CUSTOMER" dans ton groupBy?

  3. #3
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Points : 5 059
    Points
    5 059
    Par défaut
    si je l'ajoute dans le group by, j'ai l'erreur invalide identifier, si je l’enlève, en gardant la somme et le count le group by génère une erreur.

    Si j’enlève le count et le sum : (exemple pour un account)

    Month Number account customer qty
    2012-04 10 SMS CUS_PARIS 100
    2012-04 10 SMS CUS_PARIS 25
    2012-04 10 SMS CUS_PARIS 4
    2012-04 10 SMS CUS_PARIS 10

  4. #4
    Membre chevronné
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Points : 1 878
    Points
    1 878
    Par défaut
    Déplace ta sous-requête au niveau du FROM et fais le lien avec t.userID dans la clause WHERE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT  a, b, c, x
    FROM   table,
       (SELECT y, x
       FROM  table2
       WHERE 1=1)
    WHERE   a = y
    GROUP BY a,b,c,x

  5. #5
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Points : 5 059
    Points
    5 059
    Par défaut
    J'ai essayé la solution en ajoutant le test a=y dans la sous requete ce qui ne fonctionne pas.
    Ta suggestion fonctionne bien, en y ajoutant un distinct dans la sous requete parce que sinon le résultat ressemble à celui d'un join (plusieurs lignes).

    Merci

  6. #6
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Points : 5 059
    Points
    5 059
    Par défaut
    Ah je me suis avancé trop vite, il reste un cas pas traité, lorsque la sous requete ne retourne pas de résultat.

    la condition a = y bloque, je voudrais dans le cas ou a n'est pas présent dans la sous requete, retourner la ligne quand même avec y = null .

  7. #7
    Membre chevronné
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Points : 1 878
    Points
    1 878
    Par défaut
    Jointure facultative dans ce cas

    ATTENTION, il s'agit de y qui est retournée par la sous-requête dand mon exemple, la jointure facultative se fait donc sur y et non a

  8. #8
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Points : 5 059
    Points
    5 059
    Par défaut
    je n'ai jamais utilisé cette syntaxe, j'ai eu l'erreur suivante :

    ORA-25156: old style outer join (+) cannot be used with ANSI joins
    j'ai contourné le problème en ajoutant une union sans la sous requete et avec une clause not in en plus. mais au niveau performance je ne pense pas que la solution est bonne.

  9. #9
    Membre chevronné
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Points : 1 878
    Points
    1 878
    Par défaut
    C'est de la syntaxe "old school"
    Fais toin lien via un OUTER JOIN dans ce cas

  10. #10
    Membre éclairé Avatar de Arkhena
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 552
    Points : 769
    Points
    769
    Par défaut
    Citation Envoyé par Scriuiw Voir le message
    C'est de la syntaxe "old school"
    Fais toin lien via un OUTER JOIN dans ce cas
    +1

    Il serait temps d'adopter la syntaxe de la norme SQL de 1992!

  11. #11
    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 388
    Points
    18 388
    Par défaut
    Essayez ainsi :
    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
      SELECT to_char(t.created_date, 'YYYY-MM') AS Month
           , t.NUMBER
           , t.ACCOUNT
           , C.NAME          AS CUSTOMER
           , Count(t.NUMBER) AS No
           , sum(t.qty)      AS SumOfQty
        FROM cm.company_order t
             LEFT OUTER JOIN (scm.company c
             INNER JOIN scm.person per
               ON per.company_id = c.company_id
              AND c.region = '5')
               ON c.uid = t.userID
       WHERE t.created_date > to_date('2012-04-01','YYYY-MM-DD')
    GROUP BY to_char(t.created_date, 'YYYY-MM')
           , t.NUMBER
           , t.ACCOUNT
           , C.NAME;

  12. #12
    Membre chevronné
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Points : 1 878
    Points
    1 878
    Par défaut
    Il serait temps d'adopter la syntaxe de la norme SQL de 1992!
    Oui mais en même temps je me suis adapté à l'exemple donné !


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    (SELECT  C.NAME  
    FROM  scm.company c,scm.person per 
    WHERE per.company_id = c.company_id 
    AND c.region='5' AND c.uid = t.userID) 
    AS CUSTOMER

  13. #13
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Points : 5 059
    Points
    5 059
    Par défaut
    Merci messieurs, le lef outer join fonctionne très bien ....

  14. #14
    Membre éclairé Avatar de Arkhena
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 552
    Points : 769
    Points
    769
    Par défaut
    Citation Envoyé par Sniper37 Voir le message
    Merci messieurs, le lef outer join fonctionne très bien ....

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/04/2015, 13h48
  2. SELECT, JOIN et sous-requêtes dans une même colonne
    Par Alcorak dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/06/2011, 09h04
  3. [SP-2007] Ajouter une colonne de type "liste" dans une liste personnalisé
    Par strinty dans le forum SharePoint
    Réponses: 4
    Dernier message: 13/01/2011, 13h26
  4. [Graphics View] Ajouter une colonne contenant des images dans un QTableView
    Par vikki dans le forum Qt
    Réponses: 8
    Dernier message: 14/09/2010, 14h00
  5. Ajouter une colonne (par du code) dans Listview
    Par __fabrice dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 23/11/2005, 17h39

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