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 :

Sous requête Select SUM [11g]


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Cadre
    Inscrit en
    Septembre 2013
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Cadre
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2013
    Messages : 83
    Par défaut Sous requête Select SUM
    Bonjour à tous,
    dans le code suivant je n'ai pas le bon nombre de Ok et Rebuts qui remontent. Je n'arrive pas à trouver les bons paramètre dans les sous-requêtes, je ne comprends pas d'ou vient mon erreur.


    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     SELECT ress.NAME MACHINE 
    ,       ress.ID_RESOURCE
    ,       wo.id_wo
    ,       wo.id_article
    ,       ress.RATE_PREPARE_SALE
    ,       wo_op.seq
    ,       (select sum(WIP.QTY_COMPLETED)
             from WIP 
             where WIP.ID_WO = WO.ID_WO
             and  WIP.ID_WO_OP = WO_OP.ID_WO_OP
             ) OK
    ,       (select sum(WIP.QTY_defective)
             from WIP 
             where WIP.ID_WO = WO.ID_WO 
             and WIP.ID_WO_OP = WO_OP.ID_WO_OP
             ) Rebuts
    ,      ROUND(WO_INSTRUCTION.WORK_TIME_HC,3) TPS_CYCLE_UNITAIRE
    FROM   TOPPDM.RESOURCES ress 
    ,      TOPMES.WIP
    ,      TOPMES.WO
    ,      TOPMES.WO_INSTRUCTION
    ,      TOPMES.WO_OP
    WHERE  ress.ID_RESOURCE = wip.id_resource
    and    WIP.ID_WO = WO.ID_WO(+)
    AND    WIP.ID_WO_OP = WO_OP.ID_WO_OP (+)
    AND    WO_OP.ID_WO_INSTRUCTION = WO_INSTRUCTION.ID_WO_INSTRUCTION (+)
    and    WIP.END_AT_DATE >=TO_DATE ('01/09/2021', 'DD-MM-YYYY') 
    and    WIP.END_AT_DATE <TO_DATE ('01/10/2021', 'DD-MM-YYYY')
    and    ress.type = 2
    and    ress.ID_RESOURCE = 1481
    and    wo.id_wo  = 21278
    GROUP BY ress.NAME
    , ress.ID_RESOURCE, wo.id_wo
    , ress.RATE_PREPARE_SALE
    , WO_INSTRUCTION.WORK_TIME_HC
    , ROUND(WO_INSTRUCTION.WORK_TIME_HC,3)
    , wo_op.seq
    , wo.id_article
    , WO_OP.ID_WO_OP
    , WIP.QTY_COMPLETED
    , WO_OP.ID_WO_INSTRUCTION
    , WO_INSTRUCTION.ID_WO_INSTRUCTION
    , WIP.QTY_defective
    ;

  2. #2
    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
    Au hasard :
    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 sum(WIP.QTY_COMPLETED)
               from WIP 
              where WIP.ID_WO        = WO.ID_WO
                and WIP.ID_WO_OP     = WO_OP.ID_WO_OP
                and WIP.END_AT_DATE >= TO_DATE ('01/09/2021', 'DD-MM-YYYY') 
                and WIP.END_AT_DATE <  TO_DATE ('01/10/2021', 'DD-MM-YYYY')
             ) as OK
    ,       (select sum(WIP.QTY_defective)
               from WIP 
              where WIP.ID_WO        = WO.ID_WO 
                and WIP.ID_WO_OP     = WO_OP.ID_WO_OP
                and WIP.END_AT_DATE >= TO_DATE ('01/09/2021', 'DD-MM-YYYY') 
                and WIP.END_AT_DATE <  TO_DATE ('01/10/2021', 'DD-MM-YYYY')
             ) as Rebuts

  3. #3
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 215
    Par défaut
    1ère remarque :
    J'écrirais la requete 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 bla bla bla 
     
    FROM TOPPDM.RESOURCES ress 
    ,      TOPMES.WIP wip
    ,      TOPMES.WO wo
    ,      TOPMES.WO_INSTRUCTION inst
    ,      TOPMES.WO_OP op
    where  ress.type = 2
    and    ress.ID_RESOURCE = 1481
    and    wip.ID_RESOURCE = ress.id_resource
    and    WIP.END_AT_DATE >=TO_DATE ('01/09/2021', 'DD-MM-YYYY') 
    and    WIP.END_AT_DATE <TO_DATE ('01/10/2021', 'DD-MM-YYYY')
    and    WO.ID_WO(+)= WIP.ID_WO
    and    wo.id_wo  = 21278
    and    inst.ID_WO_INSTRUCTION (+)= WO_OP.ID_WO_INSTRUCTION
    and    op.ID_WO_OP (+)= WIP.ID_WO_OP
    GROUP BY bla bla bla
    Ca ne change rien, mais ça permet de mieux lire la requête : Dans le FROM, les tables sont dans l'ordre RESS, WIP , WO etc
    Donc dans le Where je mets les contraintes concernant RESS, puis celles concernant WIP, ou liant WIP à RESS , puis celles concernant WO ou liant WO à RESS ou WIP etc
    Les lignes du Where sont dans le même ordre que la liste des tables dans le From.
    C'est tellement plus simple pour relire.
    Et les outer join, ça me parait tellement plus naturel de mettre la 'nouvelle' table à gauche, et les autres tables à droite du signe égal. ( on dit bien where ress.type = 2, et pas where 2=Ress.type , c'est du même ordre)

    Maintenant, les sous-requetes... Dans la requete principale, tu as la table TOPMES.WIP, et dans les sous-requêtes, tu as la table WIP ; c'est la même table ? Et c'est normal d'avoir cette table 2 fois ??? Possible, on ne sait pas vraiment comment tout ça s'imbrique. Mais c'est suspect.

    Pour en revenir aux généralités, on a très rarement besoin de passer par des trucs de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select  a ,  ( select  ... )
    from b
    Cette structure n'est pas naturelle , à éviter strictement.
    Et en plus, tu n'as plus aucune raison de mettre group BY en bas de ta requête.

    La requete que tu as écrite, elle est strictement équivalente à :
    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
    30
    31
    32
    SELECT 
    ress.NAME MACHINE 
    ,       ress.ID_RESOURCE
    ,       wo.id_wo
    ,       wo.id_article
    ,       ress.RATE_PREPARE_SALE
    ,       wo_op.seq
    ,       (select sum(WIP.QTY_COMPLETED)
             from WIP 
             where WIP.ID_WO = WO.ID_WO
             and  WIP.ID_WO_OP = WO_OP.ID_WO_OP
             ) OK
    ,       (select sum(WIP.QTY_defective)
             from WIP 
             where WIP.ID_WO = WO.ID_WO 
             and WIP.ID_WO_OP = WO_OP.ID_WO_OP
             ) Rebuts
    ,      ROUND(instr.WORK_TIME_HC,3) TPS_CYCLE_UNITAIRE
    FROM TOPPDM.RESOURCES ress 
    ,      TOPMES.WIP wip
    ,      TOPMES.WO wo
    ,      TOPMES.WO_INSTRUCTION inst
    ,      TOPMES.WO_OP op
    where  ress.type = 2
    and    ress.ID_RESOURCE = 1481
    and    wip.ID_RESOURCE = ress.id_resource
    and    WIP.END_AT_DATE >=TO_DATE ('01/09/2021', 'DD-MM-YYYY') 
    and    WIP.END_AT_DATE <TO_DATE ('01/10/2021', 'DD-MM-YYYY')
    and    WO.ID_WO(+)= WIP.ID_WO
    and    wo.id_wo  = 21278
    and    inst.ID_WO_INSTRUCTION (+)= WO_OP.ID_WO_INSTRUCTION
    and    op.ID_WO_OP (+)= WIP.ID_WO_OP
    Il y a la clause WITH ... qui permet de faire de belles requêtes, bien lisibles...

  4. #4
    Membre confirmé
    Homme Profil pro
    Cadre
    Inscrit en
    Septembre 2013
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Cadre
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2013
    Messages : 83
    Par défaut
    Merci pour vos réponses; J'ai mis de l'ordre selon vos recommandations le résultat est le bon, j'ai du laisser le GROUP BY pour éviter les doublons. Je travaille avec SQL Developer et j'ai un message qui dit que les tables wip, wo et op sont déconnectées du reste du graphique de jointure. Pour autant les jointures y sont et la requête fonctionne. Je ne comprends pas pourquoi.

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    SELECT 
            ress.NAME MACHINE 
    ,       ress.ID_RESOURCE
    ,       wo.ID_WO
    ,       wo.ID_ARTICLE
    ,       ress.RATE_PREPARE_SALE
    ,       op.SEQ
    ,       (select sum(WIP.QTY_COMPLETED)
             from TOPMES.WIP
             where WIP.ID_WO = WO.ID_WO
             and  WIP.ID_WO_OP = op.ID_WO_OP
             ) OK
    ,       (select sum(WIP.QTY_defective)
             from TOPMES.WIP 
             where WIP.ID_WO = WO.ID_WO 
             and WIP.ID_WO_OP = op.ID_WO_OP
             ) Rebuts
    ,      ROUND(instr.WORK_TIME_HC,3) TPS_CYCLE_UNITAIRE
    FROM   TOPPDM.RESOURCES ress 
    ,      TOPMES.WIP wip
    ,      TOPMES.WO wo
    ,      TOPMES.WO_INSTRUCTION instr
    ,      TOPMES.WO_OP op
    where  ress.TYPE = 2
    and    ress.ID_RESOURCE = 1481
    and    wo.id_wo  = 21278
    and    wip.END_AT_DATE >=TO_DATE ('01/09/2021', 'DD-MM-YYYY') 
    and    wip.END_AT_DATE <TO_DATE ('01/10/2021', 'DD-MM-YYYY')
    and    ress.ID_RESOURCE  = wip.ID_RESOURCE
    and    wip.ID_WO = wo.ID_WO
    and    wip.ID_WO_OP = op.ID_WO_OP
    and    op.ID_WO_INSTRUCTION = instr.ID_WO_INSTRUCTION 
    GROUP BY
            ress.NAME
          , ress.ID_RESOURCE
          , wo.ID_WO
          , wo.ID_ARTICLE
          , ress.RATE_PREPARE_SALE
          , op.SEQ, ROUND(instr.WORK_TIME_HC,3)
          , op.ID_WO_OP
    ;

  5. #5
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 215
    Par défaut
    Autre remarque : tu mets wo.ID_WO(+)= WIP.ID_WO : outer-join
    Et plus loin : wo.id_wo = 21278 : inner-join

    La table wo est à moitié en outer-join et à moitié en inner-join, elle est donc en inner-join.

  6. #6
    Membre confirmé
    Homme Profil pro
    Cadre
    Inscrit en
    Septembre 2013
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Cadre
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2013
    Messages : 83
    Par défaut
    Bonjour à tous
    j'ai résolu mes problèmes de jointure mais le calcul des OK et REBUTS délimités par la date du 9/10 n'est pas bon. En fait j'ai la totalité des OK et Rebuts qui ont été pointés sur la ressource durant la totalité de la période, environ 6 jours.
    Avec ou sans bornage de date, le résultat est le même.
    C'est ce problème que j'ai depuis le début et que je n'arrive pas à résoudre.

    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
    30
    31
    32
    33
    34
    35
    36
    37
    SELECT 
              ress.NAME MACHINE 
    ,         ress.ID_RESOURCE
    ,         wo.ID_WO
    ,         wo.ID_ARTICLE
    ,         ress.RATE_PREPARE_SALE
    ,        (select sum(WIP.QTY_COMPLETED)
             from TOPMES.WIP
             where WIP.ID_WO = WO.ID_WO
             and  WIP.ID_WO_OP = wop.ID_WO_OP
             ) OK
    ,       (select sum(WIP.QTY_defective)
             from TOPMES.WIP 
             where WIP.ID_WO = WO.ID_WO 
             and WIP.ID_WO_OP = wop.ID_WO_OP
             ) Rebuts
    ,       ROUND(instr.WORK_TIME_HC,3) TPS_CYCLE_UNITAIRE
    FROM   TOPMES.WIP wip
    ,      TOPMES.WO wo
    ,      TOPMES.WO_OP wop
    ,      TOPPDM.RESOURCES ress 
    ,      TOPMES.WO_INSTRUCTION instr
    WHERE  wip.ID_WO = wo.ID_WO (+)
    AND      wip.ID_WO_OP = wop.ID_WO_OP (+)
    AND      wip.ID_RESOURCE = ress.ID_RESOURCE (+)
    AND      wop.ID_WO_INSTRUCTION = instr.ID_WO_INSTRUCTION (+)
    and       wip.END_AT_DATE >=TO_DATE ('01/09/2021', 'DD-MM-YYYY') 
    and       wip.END_AT_DATE <TO_DATE ('10/09/2021', 'DD-MM-YYYY')
    GROUP BY
             ress.NAME, wo.ID_WO
           , wo.ID_ARTICLE
           , ress.RATE_PREPARE_SALE
           , wop.ID_WO_OP
           , ress.ID_RESOURCE
           , instr.ID_WO_INSTRUCTION
           , ROUND(instr.WORK_TIME_HC,3)
    ;

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 26/09/2016, 11h21
  2. [AC-2007] Sous-requête "Select" dans une requête "update"
    Par MatAllwhite dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 27/06/2013, 14h00
  3. Insert multiples avec sous-requête SELECT
    Par lolymeupy dans le forum Requêtes
    Réponses: 6
    Dernier message: 08/08/2011, 17h57
  4. Insertion à base de sous requête select
    Par imane_bennouna dans le forum Langage SQL
    Réponses: 2
    Dernier message: 25/07/2006, 12h03
  5. Insertion multiple à base de sous requête SELECT
    Par drinkmilk dans le forum Langage SQL
    Réponses: 8
    Dernier message: 14/04/2005, 16h34

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