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 :

besoin d'aide sur une requette sql


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 40
    Points : 30
    Points
    30
    Par défaut besoin d'aide sur une requette sql
    bonjour,
    jJe vous explique mon problème, j'ai deux tables: T1 et T2
    Dans T1, il y a différents champs: emplacement, article, lot, quantité, numéro BonLivraison, ligneBonLivraison.
    Dans T2, il y a emplacement, article, lot, quantité, numéroBonlivraison,lignebonlivraison.
    T1 correspond a des ordres de rangement des article qu'il contient.
    T2 correspond au rangements effectués. J'ai besoin de récuperer pour un :
    numéroBonlivrainson,ligneBonlivraison, article, lot donné, l'emplacement de T1, la quantité restant a ranger(quantité de T1 pour l'emplacement -somme des quantités de T2 pour l'emplacement, article, lot, numéroBL, numéro ligne donné) tel que la somme des quantités de T2 soit inférieure a la quantité de T1 pour l'article en cours.

    La requette:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select emplacement, article, lot  from T1 S where S.quantié>(select SUM(quantité) from T2 where numéroBL='REC-ASN0300037' AND ligneBonLivraison=1000 AND emplacement=S.emplacement) AND numéroBL='REC-ASN0300037' AND ligneBonLivraison=1000
    me fournit l'emplacement dans lequel l'utilisateur doit ranger l'article en question et quelle est la quantité totale a ranger dans cet emplacement.

    Ce que je voudrais faire c'est récupérer en meme temps la quantité restant a ranger(quantité précedent moins somme des quantités déjà rangés somme des lignes de T2 avec les critères adéquats.
    Ce qui donnerai une requette du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select S.emplacement, S.article, S.lot, Y.SUM(quantité) from T1 S, T2 Y where S.quantité>(select SUM(quantité) from T2 where numéroBL='REC-ASN0300037' AND ligneBonlivraison=1000 AND LOC_0=S.LOC_0) AND S.numeroBL='REC-ASN0300037' AND S.ligneBonlivraison=1000 AND Y.numeroBL_0='REC-ASN0300037' AND Y.ligneBonlivraison=1000
    ce qui ne fonctionne pas bien évidemment.

    Par avance merci pour votre aide.

  2. #2
    Nik
    Nik est déconnecté
    Candidat au Club
    Inscrit en
    Mai 2005
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Si j'ai bien compris ton explication tu devrais t'en sortir en faisant quelque chose comme cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select S.emplacement, S.article, S.lot, Y.SUM(quantité) from T1 S, T2 Y where S.numéroBL=Y.numeroBL AND  Y.ligneBonlivraison.S.ligneBonlivraison AND S.numeroBL='REC-ASN0300037' AND S.ligneBonlivraison=1000

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 40
    Points : 30
    Points
    30
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select S.LOC_0, S.ITMREF_0, S.LOT_0, Y.SUM(QTY_0) from STOJOU S, YCBRECEPT Y where S.VCRNUM_0=Y
    .VCRNUM_0 AND Y.VCRLIN_0=S.VCRLIN_0 AND S.VCRNUM_0='REC-ASN0300037' AND S.VCRLIN_0=1000;
    ne fonctionne pas, j'obtient l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORA-00904: "Y"."SUM" : identificateur non valide
    j'ai aussi essayé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SQL> select S.LOC_0, S.ITMREF_0, S.LOT_0, SUM(Y.QTY_0) from STOJOU S, YCBRECEPT Y where S.QTYSTU_0>(
    select SUM(QTY_0) from YCBRECEPT where VCRNUM_0='REC-ASN0300037' AND VCRLIN_0=1000 AND LOC_0=S.LOC_0
    ) AND S.VCRNUM_0='REC-ASN0300037' AND S.VCRLIN_0=1000 AND Y.VCRNUM_0='REC-ASN0300037' AND Y.VCRLIN_0
    =1000;
    qui me renvoie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORA-00937: La fonction de groupe ne porte pas sur un groupe simple

  4. #4
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Si j'ai bien compris (pas sur)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT emplacement, article, lot, T1.quantite, SUM(T2.quantite), T1.quantite - SUM(T2.quantite)
    FROM T1 INNER JOIN T2 USING (emplacement, numeroBL, ligneBonLivraison)
    WHERE numeroBL          = 'REC-ASN0300037' 
      AND ligneBonLivraison = 1000
    GROUP BY emplacement, article, lot, T1.quantite
    HAVING T1.quantite > SUM(T2.quantite)

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 40
    Points : 30
    Points
    30
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT LOC_0, ITMREF_0, LOT_0, STOJOU.QTYSTU_0, SUM(YCBRECEPT.QTY_0), STOJOU.QTYSTU_0 - SUM(YCBRECEPT.QTY_0) 
    FROM STOJOU INNER JOIN YCBRECEPT USING (LOC_0, VCRNUM_0, VCRLIN_0)
    WHERE VCRNUM_0= 'REC-ASN0300037'
      AND VCRLIN_0 = 1000
    GROUP BY LOC_0, ITMREF_0, LOT_0, STOJOU.QTYSTU_0
    HAVING STOJOU.QTYSTU_0 > SUM(YCBRECEPT.QTY_0)
    me renvoie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SQL> 
      1  SELECT LOC_0, ITMREF_0, LOT_0, STOJOU.QTYSTU_0, SUM(YCBRECEPT.QTY_0), STOJOU.QTYSTU_0 - SUM(YCB
      2  FROM STOJOU INNER JOIN YCBRECEPT USING (LOC_0, VCRNUM_0, VCRLIN_0)
      3  WHERE VCRNUM_0= 'REC-ASN0300037'
      4    AND VCRLIN_0 = 1000
      5  GROUP BY LOC_0, ITMREF_0, LOT_0, STOJOU.QTYSTU_0
      6* HAVING STOJOU.QTYSTU_0 > SUM(YCBRECEPT.QTY_0)
    GROUP BY LOC_0, ITMREF_0, LOT_0, STOJOU.QTYSTU_0
                             *
    ERREUR à la ligne 5 :
    ORA-00918: Définition de colonne ambigu
    J'ai juste remplacé T1 et T2 par le nom de mes tables ainsi que le nom des champs.
    Une idée? je ne maitrise pas très bien les jointures.
    Merci

  6. #6
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 224
    Points : 19 566
    Points
    19 566
    Billets dans le blog
    25
    Par défaut
    Visiblement LOT_O doit se trouver dans les 2 tables incriminées. Spécifiez le nom de la table devant chacune des colonnes ambigües.

  7. #7
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    fadace a raison.
    Plus précisément, j'ai utilisé le USING pour la définition de l'INNER JOIN, il n'est donc pas nécessaire de préciser (c'est même interdit) la table d'origine de ces colonnes (même nom, même valeur), par contre, pour toutes les autres colonnes il est obligatoire de préciser la table d'origine, s'il y a un risque d'ambigüité.

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 40
    Points : 30
    Points
    30
    Par défaut
    merci beaucoup, je me coucherais moins c... ce soir.
    @+ et sincerement merci.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 40
    Points : 30
    Points
    30
    Par défaut
    Finalement ce n'est pas exactement ce qu'il me faut, en fait, j'aurais besoin aussi de recuperer l'emplacement dans le cas ou il n'y ai aucun enregistrement dans la deuxieme table car avec cette requette s'il n'y a pas d'enregistrements correspondants dans la seconde table oracle me renvoie aucune ligne selectionnée.

    Par avance merci pour votre aide

  10. #10
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    LEFT OUTER JOIN à la place de INNER JOIN (et peut être un NVL dans le HAVING)

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 40
    Points : 30
    Points
    30
    Par défaut
    Peux tu me dire comment utiliser nvl dans ce cas?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT LOC_0, STOJOU.ITMREF_0, STOJOU.LOT_0, STOJOU.QTYSTU_0, SUM(YCBRECEPT.QTY_0), STOJOU.QTYSTU_0 - SUM(YCBRECEPT.QTY_0)
    FROM STOJOU LEFT OUTER JOIN YCBRECEPT USING (LOC_0, VCRNUM_0, VCRLIN_0)
    WHERE VCRNUM_0= 'REC-ASN0300050'
    GROUP BY LOC_0, STOJOU.ITMREF_0, STOJOU.LOT_0, STOJOU.QTYSTU_0
    HAVING STOJOU.QTYSTU_0 > SUM(YCBRECEPT.QTY_0)
    J'ai vu que ca permettait de remplacer une valeur nulle par une autree expression mais je ne vois pas très bien comment l'utiliser dans ce cas précis.

    Par avance merci

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 40
    Points : 30
    Points
    30
    Par défaut
    en fait je l'ai utilisé comme cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT LOC_0, STOJOU.ITMREF_0, STOJOU.LOT_0, STOJOU.QTYSTU_0, SUM(NVL(YCBRECEPT.QTY_0,0)), STOJOU.QTYSTU_0 - SUM(YCBRECEPT.QTY_0)
    FROM STOJOU LEFT OUTER JOIN YCBRECEPT USING (LOC_0, VCRNUM_0, VCRLIN_0)
    WHERE VCRNUM_0= 'REC-ASN0300050'
    GROUP BY LOC_0, STOJOU.ITMREF_0, STOJOU.LOT_0, STOJOU.QTYSTU_0
    HAVING STOJOU.QTYSTU_0 > SUM(YCBRECEPT.QTY_0)
    mais cela me renvoie aucune ligne selectionnée car je n'ai pas d'enregistrements dans YCBRECEPT (T2) et je voudrais que dans ce cas il me renvoie la première valeur de STOJOU (T1) qu'il trouve.
    En plus je suis contraint à faire ca en une seule requette:-)

  13. #13
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Pas loin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT   LOC_0, s.ITMREF_0, s.LOT_0, s.QTYSTU_0, 
             SUM(NVL(y.QTY_0,0)), 
             s.QTYSTU_0 - SUM(NVL(y.QTY_0, 0)) 
    FROM     STOJOU s LEFT OUTER JOIN YCBRECEPT y USING (LOC_0, VCRNUM_0, VCRLIN_0) 
    WHERE    VCRNUM_0= 'REC-ASN0300050' 
    GROUP BY LOC_0, s.ITMREF_0, s.LOT_0, s.QTYSTU_0 
    HAVING   s.QTYSTU_0 > SUM(NVL(y.QTY_0, 0))

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 40
    Points : 30
    Points
    30
    Par défaut
    merci, j'ai fais la meme en left outer join
    @+

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

Discussions similaires

  1. Besoin d'aide sur une requête SQL
    Par omran.info dans le forum Requêtes
    Réponses: 3
    Dernier message: 14/11/2012, 10h28
  2. Besoin d'aide sur une requête SQL
    Par Khyinn dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/07/2010, 21h23
  3. Besoin d'aide sur une requete sql
    Par Neo57 dans le forum Requêtes
    Réponses: 5
    Dernier message: 13/01/2010, 15h43
  4. Réponses: 1
    Dernier message: 03/08/2005, 11h41

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