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 :

Relier deux requêtes


Sujet :

SQL Oracle

  1. #1
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 156
    Par défaut Relier deux requêtes
    bonjour les developpeurs
    j'espère que vous pouvez m'aider dans mon problème qui est un peu compliqué
    j'ai une table article(designation,nom_direction,quantite,montant)
    sachant qu'une direction peut demander plusieurs articles
    exemple:
    direction designation quantité montant
    -------- ---------- ------- --------
    ABC camion 5 10
    ABC engin 4 20
    DEF engin 3 15
    DEF mazda 6 10
    je voudrais afficher cette table de la manière suivante:
    1-designation,la quantité totale,le montant total
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select distinct designation,sum(quantite),sum(montant)
    from article
    group by designation
    nom_article:=fieldbyname('designation').asstring
    2-le montant,la quantité de chaque direction pour un article
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    'select quantité as"QtéABC",montant as"MontABC"from article
    where designation='+nom_article
    and nom_direction=''ABC''
    la même chose pour les autres directions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    'select quantité as"QtéDEF",montant as"MontDEF"from article
    where designation='+nom_article
    and nom_direction=''DEF''
    mais je ne sais pas comment relier ces deux requetes
    pour afficher le resultat dans un DBgrid (je travaille sous delphi)
    please help me

  2. #2
    Membre éprouvé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mai 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 126
    Par défaut
    tu fais un from de plusieurs requetes que tu relies

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select alias1.   , alias2 ...
    from ( requete 1) alias1,
           (requete2) alias2,
           (requete3) alias3
    where alias1.champ1= ALIAS2.champ1 ...

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 156
    Par défaut
    merci deadoralive pour votre reponse
    j'ai appliqué ton code, il marche bien,,mais il ya un problème: la redondance
    les noms d'articles sont affichés en double,parce que quand j'ai fait ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select designation,sum(quantite),sum(montant), ABC.quantite,ABC.montant,DEF.quantite,DEF.montant
    from article,(select quantite,montant from article where nom_direction=''ABC'')ABC,(select quantite,montant from article where nom_direction="DEF")DEF...
    where.......
    group by designation,ABC.quantite,ABC.montant,DEF.quantite,DEF.montant
    il manque toujours de préciser à quel article appartient la quantite (et le montant) choisie pour la direction "ABC"
    ............
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select quantite,montant from article where nom_dir="ABC" and designation=????)ABC

  4. #4
    Membre éprouvé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mai 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 126
    Par défaut
    Peux tu donner ton code complet,

    Les sommes doivent être dans les tables dérivées, et si tu fais bien les jointures tu ne dois pas avoir de doublons

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 156
    Par défaut

    le code est en dessus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT designation,sum(quantite),sum(montant), ABC.quantite,ABC.montant,DEF.quantite,DEF.montant
    FROM article,(SELECT quantite,montant FROM article WHERE nom_direction=''ABC'')ABC,(SELECT quantite,montant FROM article WHERE nom_direction="DEF")DEF...
    WHERE.......
    GROUP BY designation,ABC.quantite,ABC.montant,DEF.quantite,DEF.montant

  6. #6
    Membre éclairé Avatar de rvfranck
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 746
    Par défaut
    Citation Envoyé par jean sami Voir le message
    il manque toujours de préciser à quel article appartient la quantite (et le montant) choisie pour la direction "ABC"
    ............
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select quantite,montant from article where nom_dir="ABC" and designation=????)ABC
    Tu n'as qu'a mettre l'attribut designation dans ta requete SELECT:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT designation, quantite, montant FROM article WHERE nom_dir="ABC" ....
    WHERE article.designation = ABC.designation ....
    Il doit avoir une meilleur façon de le faire, car ici tu dois taper tous les directions dans ta requete. Je ne sais pas si juste avec SQL tu peux eviter ça, mais avec le SQL DYNAMIQUE (PL/SQL) tu peux créer une fonction qui va générer ta requete, ainsi même si on ajoute ou supprime une direction ton code sera toujours valide.

  7. #7
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 156
    Par défaut
    merci rvfranck pour votre reponse
    en fait,j'ai ajouté cette condition, mais sans interêt
    ce que j'ai comme resultat c'est les quantités et les montants de chaque direction, mais ils ne correspondent pas à la désignation de l'article

  8. #8
    Membre éclairé Avatar de rvfranck
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 746
    Par défaut
    Je vais tester ça. Peux tu mettre ta requete (2 directions seulemnt pour l'exemple)?

  9. #9
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 156
    Par défaut
    ok,thank you
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT designation,sum(quantite),sum(montant), ABC.quantite,ABC.montant,DEF.quantite,DEF.montant
    FROM article,(SELECT quantite,montant FROM article WHERE nom_direction=''ABC'')ABC,(SELECT quantite,montant FROM article WHERE nom_direction="DEF")DEF
    WHERE....//là il ya plusieurs conditions,,, l'article est lié à une commande...etc
    GROUP BY designation,ABC.quantite,ABC.montant,DEF.quantite,DEF.montant

  10. #10
    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
    Si vos conditions de filtrage le permettent, je pense que vous pouvez utiliser une fonction analytique (enfin quatre) pour n'attaquer qu'une seule fois votre table Articles.

    Et si votre version / licencing Oracle le permet.

  11. #11
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 156
    Par défaut
    merci Waldar
    j'ai oublié de vous dire que je suis un débutant en sql
    pouvez vous SVP me donner une explication

  12. #12
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Je pense que vous devez regarder le group by cube
    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
     
    SQL> r
      1  With data As
      2  (
      3  Select 'ABC' direction, 'camion' designation, 5 quantite, 10 montant from dual union all
      4  Select 'ABC' direction, 'engin' designation, 4 quantite, 20 montant from dual union all
      5  Select 'DEF' direction, 'engin' designation, 3 quantite, 15 montant from dual union all
      6  Select 'DEF' direction, 'mazda' designation, 6 quantite, 10 montant from dual
      7  )
      8  Select direction, designation, sum(quantite), sum(montant)
      9  From data
     10* Group By cube(direction, designation)
     
    DIR DESIGN SUM(QUANTITE) SUM(MONTANT)
    --- ------ ------------- ------------
                          18           55
        engin              7           35
        mazda              6           10
        camion             5           10
    ABC                    9           30
    ABC engin              4           20
    ABC camion             5           10
    DEF                    9           25
    DEF engin              3           15
    DEF mazda              6           10
     
    10 ligne(s) sÚlectionnÚe(s).

  13. #13
    Membre éclairé Avatar de rvfranck
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 746
    Par défaut
    Essaie ça aussi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SELECT designation, 
    MAX (CASE WHEN direction = 'ABC' THEN quantite ELSE 0 END) qte_ABC, 
    MAX (CASE WHEN direction = 'DEF' THEN quantite ELSE 0 END) qte_DEF,
    SUM (quantite) qte_total, 
    MAX (CASE WHEN direction = 'ABC' THEN montant ELSE 0 END) mnt_ABC, 
    MAX (CASE WHEN direction = 'DEF' THEN montant ELSE 0 END) mnt_DEF,
    SUM (montant) mnt_total
    FROM (
    SELECT designation, direction, quantite, montant
    FROM article
    ORDER BY 1,2 ASC
    )
    GROUP BY designation

  14. #14
    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
    En complément de ce qu'à écrit mnitu, il est vraiment de bon ton d'associer la fonction grouping dès qu'on utilise cube ou rollup, on y voit beaucoup plus clair.

    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
    WITH data AS
    (
    SELECT 'ABC' direction, 'camion' designation, 5 quantite, 10 montant FROM dual union ALL
    SELECT 'ABC' direction, 'engin' designation, 4 quantite, 20 montant FROM dual union ALL
    SELECT 'DEF' direction, 'engin' designation, 3 quantite, 15 montant FROM dual union ALL
    SELECT 'DEF' direction, 'mazda' designation, 6 quantite, 10 montant FROM dual
    )
    SELECT
        decode(grouping(direction), 1, 'Toutes directions', direction) direction,
        decode(grouping(designation), 1, 'Tous produits', designation) designation,
        sum(quantite),
        sum(montant)
    FROM data
    GROUP BY
        cube(direction, designation)
    rvfranck, d'intuition j'aurai plutôt utilisé des sommes que des max, mais ça dépend de ce que veux faire jean sami

    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
    WITH data AS
    (
    SELECT 'ABC' direction, 'camion' designation, 5 quantite, 10 montant FROM dual union ALL
    SELECT 'ABC' direction, 'engin' designation, 4 quantite, 20 montant FROM dual union ALL
    SELECT 'DEF' direction, 'engin' designation, 3 quantite, 15 montant FROM dual union ALL
    SELECT 'DEF' direction, 'mazda' designation, 6 quantite, 10 montant FROM dual
    )
    select
        designation,
        sum(quantite) quantite_total,
        sum(montant) montant_total,
        sum(decode(direction, 'ABC', quantite, 0)) quantite_ABC,
        sum(decode(direction, 'ABC', montant, 0)) montant_ABC,
        sum(decode(direction, 'DEF', quantite, 0)) quantite_DEF,
        sum(decode(direction, 'DEF', montant, 0)) montant_DEF
    FROM data
    GROUP BY
        designation
    On peut mettre case à la place de decode bien entendu.

  15. #15
    Membre éclairé Avatar de rvfranck
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 746
    Par défaut
    Citation Envoyé par Waldar Voir le message
    rvfranck, d'intuition j'aurai plutôt utilisé des sommes que des max, mais ça dépend de ce que veux faire jean sami
    Si j'ai bien compris le problème de Jean Sami, alors SUM ou MAX peu importe vu que DIRECTION et DESIGNATION sont en quelque sorte la clé primaire de la table.

    SUM et MAX (du moins dans mon cas, mais je pense que dans le votre aussi) c'est juste pour que le GROUP BY puisse se faire.

  16. #16
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 156
    Par défaut
    merci tous pour vos reponses
    j'ai essayé d'appliquer le code de rvfranck,et il marche bien
    mais j'ai rencontré un petit problème:
    je travaille sous delphi, j'utilise ce truc (en dessous) pour lire les valeurs de type "Real",car les valeurs sont affichées sans la virgule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TRIM(to_char(montant ,''999999999999.99''))
    mais lorsque je l'ai appliqué sur le code de rvfranck, il ne connait pas l'attribut "montant"
    existe elle une autre méthode pour lire les valeurs de type réelle

  17. #17
    Membre éclairé Avatar de rvfranck
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 746
    Par défaut
    Citation Envoyé par jean sami Voir le message
    mais lorsque je l'ai appliqué sur le code de rvfranck, il ne connait pas l'attribut "montant"
    existe elle une autre méthode pour lire les valeurs de type réelle
    En espérant avoir compris ta question...
    C'est normal, car le "SELECT" du code que j'ai posté ne renvoie pas d'attribut "MONTANT", designation, qte_ABC, qte_DEF, qte_total, mnt_ABC, mnt_DEF, mnt_total sont les attributs renvoyés par le "SELECT".

  18. #18
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 156
    Par défaut
    non ,je ne veux pas dire ça
    voici le code complet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT designation, 
    MAX (CASE WHEN direction = 'ABC' THEN quantite ELSE 0 END) qte_ABC, 
    MAX (CASE WHEN direction = 'DEF' THEN quantite ELSE 0 END) qte_DEF,
    SUM (quantite) qte_total, 
    MAX (CASE WHEN direction = 'ABC' THEN montant ELSE 0 END) mnt_ABC, 
    MAX (CASE WHEN direction = 'DEF' THEN montant ELSE 0 END) mnt_DEF,
    SUM (montant) mnt_total
    FROM (
    SELECT designation, direction, quantite, 
    trim(to_char(montant ,''99999999999999.99''))
    FROM article
    ORDER BY 1,2 ASC
    )
    GROUP BY designation
    j'ai ajouté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    trim(to_char(montant ,''99999999999999.99''))
    pour lire les valeurs de type réelles, car sous delphi ces valeurs sont affichées sans la virgule
    mais lorsque j'ai appliqué ce code là dessus,il me retourne un message d'erreur(le "montant" n'existe pas)

  19. #19
    Membre éclairé Avatar de rvfranck
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 746
    Par défaut
    Regarde bien... au niveau des max(case...) tu utilises encore l'attribut MONTANT alors que tu as fait ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    trim(to_char(montant ,''99999999999999.99''))
    tu modifies ainsi le nom du champ en
    TRIM(TO_CHAR(MONTANT,'99999999999999.99'))
    Essaie ça:
    TRIM(TO_CHAR(MONTANT,'99999999999999.99')) montant

    POURQUOI ''99999999999999.99'' et pas '99999999999999.99'?

  20. #20
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 156
    Par défaut
    malheureusement malheureusement ,il ne marche pas
    voici mon code de A à Z:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT l.designation"Designation",
    SUM (l.quantite) "Qté_totale",
    trim(to_char(SUM(l.montant),''999999999999999.99'')) "Mnt_total",
    MAX (CASE WHEN l.nom_dir= ''ABC'' THEN l.quantite ELSE 0 END) "Qté_ABC",
    MAX (CASE WHEN l.nom_dir= ''ABC'' THEN trim(to_char(l.montant,''999999999999999.99'')) ELSE 0 END) "Mnt_ABC",
    MAX (CASE WHEN l.nom_dir= ''DEF'' THEN l.quantite ELSE 0 END) "Qté_DEF",
    MAX (CASE WHEN l.nom_dir= ''DEF'' THEN trim(to_char(l.montant,''999999999999999.99'')) ELSE 0 END) "Mnt_DEF"
    FROM (select TRIM(to_char(montant, ''999999999999999.99'')) "montant",numero_cmd,
    designation, nom_dir, quantite
    FROM lot
    ORDER BY 1,2 ASC)l,commande c
    and c.numero=l.numero_cmd(+)
    GROUP BY l.designation
    please, si qlq1 sait la reponse, aidez moi

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. SQL relier le résultat de deux requêtes
    Par Chris'S dans le forum Langage SQL
    Réponses: 2
    Dernier message: 12/01/2010, 16h42
  2. Mixer deux requêtes
    Par WriteLN dans le forum Requêtes
    Réponses: 3
    Dernier message: 14/11/2005, 09h34
  3. Afficher le ratio du résultat de deux requêtes
    Par decour dans le forum Access
    Réponses: 25
    Dernier message: 07/11/2005, 19h54
  4. [TP] Relier deux points ?
    Par wwwroom dans le forum Turbo Pascal
    Réponses: 9
    Dernier message: 28/06/2005, 19h04
  5. [débutant] relier deux tables
    Par benoitB dans le forum Débuter
    Réponses: 4
    Dernier message: 27/06/2005, 14h04

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