Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 18 sur 18
  1. #1
    Invité de passage
    Inscrit en
    août 2010
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : août 2010
    Messages : 77
    Points : 3
    Points
    3

    Par défaut Requête un peu compliquée

    salut tout le monde,

    j'ai deux tableaux :
    Le premier contient les commandes : Commandes----Date_commande-----produit-------quantite

    Le deuxième contient les livraisons : date_livraison-----produit-------quantite

    Ma requête doit trouver toutes les commandes dont tous (je répète tous) les produits sont livrés (c'est à dire que la date de livraison de ces produits doivent être avant la date de commandes)

    Bon les tableau n'étaient pas comme ça mais j'ai pu enfin le raffiner pour enfin obtenir ces deux tableaux mais je suis arrêté là car je n'ai pas pu trouver la solution comment je peux faire.

    quelqu'un peut m'aider svp ?

  2. #2
    Membre Expert
    Avatar de islamov2000
    Homme Profil pro islamov islamov
    Ingénieur d'études & developpement en informatique
    Inscrit en
    septembre 2007
    Messages
    628
    Détails du profil
    Informations personnelles :
    Nom : Homme islamov islamov
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : septembre 2007
    Messages : 628
    Points : 1 172
    Points
    1 172

    Par défaut

    Table et non pas tableau.
    Peux tu poster tes essais avec un jeu de données pour t'aider?
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  3. #3
    Invité de passage
    Inscrit en
    août 2010
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : août 2010
    Messages : 77
    Points : 3
    Points
    3

    Par défaut

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT  commande.date_commande, commande.commande, commande.produit, commande.quantite
    FROM commande
    WHERE EXISTS 
    (
     SELECT livraison.produit, SUM(livraison.quatite) AS qt
     FROM livraison
     
     WHERE commande.produit = livraison.produit
     AND livraison.date_livraison <= commande.date_commande
     AND commande.quantite <= qt
     GROUP BY (livraison.produit)
    )

  4. #4
    Membre chevronné Avatar de jkofr
    Homme Profil pro Jacques Kostic
    Senior Consultant DBA (Trivadis SA)
    Inscrit en
    octobre 2006
    Messages
    484
    Détails du profil
    Informations personnelles :
    Nom : Homme Jacques Kostic
    Âge : 45
    Localisation : Suisse

    Informations professionnelles :
    Activité : Senior Consultant DBA (Trivadis SA)
    Secteur : Conseil

    Informations forums :
    Inscription : octobre 2006
    Messages : 484
    Points : 686
    Points
    686

    Par défaut

    Citation Envoyé par molo1987 Voir le message
    c'est à dire que la date de livraison de ces produits doivent être avant la date de commandes

    Hello,

    Je comprends pas...

    Ce n'est pas plutôt:

    c'est à dire que la date de livraison de ces produits doivent être après la date de commandes?

    jko
    OCM 11g, RAC and Performance & Tuning Expert 11g
    RMAN Backup & Recovery, Data Guard and Grid Control

  5. #5
    Invité de passage
    Inscrit en
    août 2010
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : août 2010
    Messages : 77
    Points : 3
    Points
    3

    Par défaut

    Citation Envoyé par jkofr Voir le message
    Hello,

    Je comprends pas...

    Ce n'est pas plutôt:

    c'est à dire que la date de livraison de ces produits doivent être après la date de commandes?

    jko
    la requete doivent selectioner tout les commandes dont toutes ses produits sont livrable avant la data de commande

    Explication:
    je commande trois choses (p1-p2-p3) pour le 20-02-1013
    pour que le systeme puisse confirmer cette commande:il doit verifier que toutes les produits (p1-p2-p3)de cette commande sont livrable avant le 20-02-2013

  6. #6
    Membre chevronné Avatar de jkofr
    Homme Profil pro Jacques Kostic
    Senior Consultant DBA (Trivadis SA)
    Inscrit en
    octobre 2006
    Messages
    484
    Détails du profil
    Informations personnelles :
    Nom : Homme Jacques Kostic
    Âge : 45
    Localisation : Suisse

    Informations professionnelles :
    Activité : Senior Consultant DBA (Trivadis SA)
    Secteur : Conseil

    Informations forums :
    Inscription : octobre 2006
    Messages : 484
    Points : 686
    Points
    686

    Par défaut

    okidoki! capito!

    jko
    OCM 11g, RAC and Performance & Tuning Expert 11g
    RMAN Backup & Recovery, Data Guard and Grid Control

  7. #7
    Invité de passage
    Inscrit en
    août 2010
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : août 2010
    Messages : 77
    Points : 3
    Points
    3

    Par défaut

    ???

  8. #8
    Membre chevronné Avatar de jkofr
    Homme Profil pro Jacques Kostic
    Senior Consultant DBA (Trivadis SA)
    Inscrit en
    octobre 2006
    Messages
    484
    Détails du profil
    Informations personnelles :
    Nom : Homme Jacques Kostic
    Âge : 45
    Localisation : Suisse

    Informations professionnelles :
    Activité : Senior Consultant DBA (Trivadis SA)
    Secteur : Conseil

    Informations forums :
    Inscription : octobre 2006
    Messages : 484
    Points : 686
    Points
    686

    Par défaut

    Citation Envoyé par molo1987 Voir le message
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT  commande.date_commande, commande.commande, commande.produit, commande.quantite
    FROM commande
    WHERE EXISTS 
    (
     SELECT livraison.produit, SUM(livraison.quatite) AS qt
     FROM livraison
     
     WHERE commande.produit = livraison.produit
     AND livraison.date_livraison <= commande.date_commande
     AND commande.quantite <= qt
     GROUP BY (livraison.produit)
    )
    Hello molo1987,

    Tu ne peux pas référencer un alias dans la clause where.

    SQL Error: ORA-00904: "QT": invalid identifier
    00904. 00000 - "%s: invalid identifier"

    jko
    OCM 11g, RAC and Performance & Tuning Expert 11g
    RMAN Backup & Recovery, Data Guard and Grid Control

  9. #9
    Invité de passage
    Inscrit en
    août 2010
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : août 2010
    Messages : 77
    Points : 3
    Points
    3

    Par défaut

    Citation Envoyé par jkofr Voir le message
    Hello molo1987,

    Tu ne peux pas référencer un alias dans la clause where.

    SQL Error: ORA-00904: "QT": invalid identifier
    00904. 00000 - "%s: invalid identifier"

    jko
    je ne l'ai pas encore tester sur oracle mais ce qui m'interesse maintenant c comment faire pour resoudre cette requete

  10. #10
    Membre chevronné Avatar de jkofr
    Homme Profil pro Jacques Kostic
    Senior Consultant DBA (Trivadis SA)
    Inscrit en
    octobre 2006
    Messages
    484
    Détails du profil
    Informations personnelles :
    Nom : Homme Jacques Kostic
    Âge : 45
    Localisation : Suisse

    Informations professionnelles :
    Activité : Senior Consultant DBA (Trivadis SA)
    Secteur : Conseil

    Informations forums :
    Inscription : octobre 2006
    Messages : 484
    Points : 686
    Points
    686

    Par défaut

    Voici une option:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    alter session set nls_date_format='dd-mm-yyyy';
     
    create table commande
    (
    date_commande  date, id number, produit number, quantite number
    );
     
    create table livraison
    (
    date_livraison date, produit number, quantite number
     
    )
     
     
    insert into commande values ('10-12-2012',1,5,2);
    insert into commande values ('10-12-2012',1,6,2);
    insert into commande values ('10-12-2012',2,7,2);
    insert into livraison values ('09-12-2012', 5, 6);
    insert into livraison values ('09-12-2012', 6, 6);
    insert into livraison values ('12-12-2012', 7, 6);
    Code :
    1
    2
    3
    select date_commande,commande.id, commande.produit from commande
    having sum (commande.quantite) <= (select sum (quantite) from livraison where produit = commande.produit and date_livraison <= commande.date_commande group by produit)
    group by date_commande,id, produit
    Code :
    1
    2
    3
    4
    DATE_COMMANDE ID PRODUIT
    ------------- -- -------
    10-12-2012     1       5 
    10-12-2012     1       6
    jko
    OCM 11g, RAC and Performance & Tuning Expert 11g
    RMAN Backup & Recovery, Data Guard and Grid Control

  11. #11
    Invité de passage
    Inscrit en
    août 2010
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : août 2010
    Messages : 77
    Points : 3
    Points
    3

    Par défaut

    Tout d'abord merci pour votre aide, mais là tu as fait exactement l'erreur que j'ai faite dans ma requête. La requête affiche ici la commande pourtant elle a son produit 7 qui n'est pas livrable avant la date de commande. Moi ce que je veux faire c'est tester tous les produits de cette commande. Si ils sont tous je répète tous, donc le système peut la confirmer.
    c'est à dire là dans ta table, la requête doit tester les trois produits. Si tous sont livrables donc affiche la commande.

  12. #12
    Membre chevronné Avatar de jkofr
    Homme Profil pro Jacques Kostic
    Senior Consultant DBA (Trivadis SA)
    Inscrit en
    octobre 2006
    Messages
    484
    Détails du profil
    Informations personnelles :
    Nom : Homme Jacques Kostic
    Âge : 45
    Localisation : Suisse

    Informations professionnelles :
    Activité : Senior Consultant DBA (Trivadis SA)
    Secteur : Conseil

    Informations forums :
    Inscription : octobre 2006
    Messages : 484
    Points : 686
    Points
    686

    Par défaut

    Hello,

    Il y a deux commandes dans le test case

    La 1 et la 2

    La 1 remplie ta condition mais pas la 2.

    Donc la requête fonctionne. Non ?

    Jko
    OCM 11g, RAC and Performance & Tuning Expert 11g
    RMAN Backup & Recovery, Data Guard and Grid Control

  13. #13
    Invité de passage
    Inscrit en
    août 2010
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : août 2010
    Messages : 77
    Points : 3
    Points
    3

    Par défaut

    Non c'est faux là. Car si tu ajoutes une commande pour la commande 2 qui livrable. Comme résultat tu aurais les deux commandes pourtant la commande 2 possède un pdt livrable et un autre non livrable. donc la requête est fausse.
    Moi ce que je veux c'est soit tout sinon rien.

  14. #14
    Membre chevronné Avatar de jkofr
    Homme Profil pro Jacques Kostic
    Senior Consultant DBA (Trivadis SA)
    Inscrit en
    octobre 2006
    Messages
    484
    Détails du profil
    Informations personnelles :
    Nom : Homme Jacques Kostic
    Âge : 45
    Localisation : Suisse

    Informations professionnelles :
    Activité : Senior Consultant DBA (Trivadis SA)
    Secteur : Conseil

    Informations forums :
    Inscription : octobre 2006
    Messages : 484
    Points : 686
    Points
    686

    Par défaut

    ok,

    Je trouve ton modèle un peu currieux mais bon.

    Test:
    J'ajoute une commande livrable à la commande 2.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
     
    ALTER session SET nls_date_format='dd-mm-yyyy';
     
    INSERT INTO commande VALUES ('10-12-2012',2,8,2);
    INSERT INTO livraison VALUES ('09-12-2012',8, 6);
    SELECT date_commande,commande.id, commande.produit FROM commande
    HAVING sum (commande.quantite) <= (SELECT sum (quantite) FROM livraison WHERE produit = commande.produit AND date_livraison <= commande.date_commande GROUP BY produit)
    GROUP BY date_commande,id, produit
    Code :
    1
    2
    3
    4
    5
    DATE_COMMANDE ID PRODUIT
    ------------- -- -------
    10-12-2012     2       8 
    10-12-2012     1       5 
    10-12-2012     1       6
    Effectivement la commande 2 sur le produit 8 apparait.

    Voici une solution:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
     
    Select date_commande,id,produit,quantite
    from commande 
    where id in 
    (select id 
     from 
     (
      select date_commande,id,sum (flag) flag, count (*) Cnt
      From
      (
       SELECT c.date_commande,c.id, c.produit, case when l.date_livraison > c.date_commande then 0 else 1 end as flag
       FROM commande c join Livraison L on C.Produit = l.Produit
      ) group by date_commande,id
     )where flag = Cnt
    )
    Code :
    1
    2
    3
    4
    DATE_COMMANDE ID PRODUIT QUANTITE
    ------------- -- ------- --------
    10-12-2012     1       6        2 
    10-12-2012     1       5        2
    La commande 2 n'apparait plus.

    Il y a aussi moyen d'intégrer le test de disponibilité du nombre d'articles...

    Bonne soirée
    jko
    OCM 11g, RAC and Performance & Tuning Expert 11g
    RMAN Backup & Recovery, Data Guard and Grid Control

  15. #15
    Invité de passage
    Inscrit en
    août 2010
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : août 2010
    Messages : 77
    Points : 3
    Points
    3

    Par défaut

    Question : c'est quoi cet id ? Sinon comment faire pour le nombre d'articles.
    Merci beaucoup.

  16. #16
    Membre chevronné Avatar de jkofr
    Homme Profil pro Jacques Kostic
    Senior Consultant DBA (Trivadis SA)
    Inscrit en
    octobre 2006
    Messages
    484
    Détails du profil
    Informations personnelles :
    Nom : Homme Jacques Kostic
    Âge : 45
    Localisation : Suisse

    Informations professionnelles :
    Activité : Senior Consultant DBA (Trivadis SA)
    Secteur : Conseil

    Informations forums :
    Inscription : octobre 2006
    Messages : 484
    Points : 686
    Points
    686

    Par défaut

    Ben c'est ton id de commande.
    OCM 11g, RAC and Performance & Tuning Expert 11g
    RMAN Backup & Recovery, Data Guard and Grid Control

  17. #17
    Invité de passage
    Inscrit en
    août 2010
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : août 2010
    Messages : 77
    Points : 3
    Points
    3

    Par défaut

    est ce que je peux le remplacer par produit?

  18. #18
    Membre chevronné Avatar de jkofr
    Homme Profil pro Jacques Kostic
    Senior Consultant DBA (Trivadis SA)
    Inscrit en
    octobre 2006
    Messages
    484
    Détails du profil
    Informations personnelles :
    Nom : Homme Jacques Kostic
    Âge : 45
    Localisation : Suisse

    Informations professionnelles :
    Activité : Senior Consultant DBA (Trivadis SA)
    Secteur : Conseil

    Informations forums :
    Inscription : octobre 2006
    Messages : 484
    Points : 686
    Points
    686

    Par défaut

    Citation Envoyé par molo1987 Voir le message
    est ce que je peux le remplacer par produit?
    Non.

    Voici la version avec controle du stock disponible livrable.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT date_commande,id,produit,quantite
    FROM commande 
    WHERE id IN 
    (SELECT id 
     FROM 
     (
      SELECT date_commande,id,sum (flag) flag, count (*) Cnt, Sum (FlagQt) FlagQt
      FROM
      (
       SELECT c.date_commande,c.id, c.produit, case when c.quantite > l.quantite then 0 else 1 end AS flagQt, case when l.date_livraison > c.date_commande then 0 else 1 end AS flag
       FROM commande c JOIN Livraison L ON C.Produit = l.Produit
      ) GROUP BY date_commande,id
     )WHERE flag = Cnt and flagqt = Cnt
    )
    Je pense cependant que tu devrais sérieusement revoir ton modèle.

    Bonne journée
    jko
    OCM 11g, RAC and Performance & Tuning Expert 11g
    RMAN Backup & Recovery, Data Guard and Grid Control

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •