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 :

Requête un peu compliquée


Sujet :

SQL Oracle

  1. #1
    Nouveau membre du Club
    Inscrit en
    Août 2010
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 77
    Points : 32
    Points
    32
    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 expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    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
    Nouveau membre du Club
    Inscrit en
    Août 2010
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 77
    Points : 32
    Points
    32
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 éclairé Avatar de jkofr
    Homme Profil pro
    Senior Consultant DBA (Trivadis SA)
    Inscrit en
    Octobre 2006
    Messages
    484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Suisse

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 484
    Points : 724
    Points
    724
    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
    Nouveau membre du Club
    Inscrit en
    Août 2010
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 77
    Points : 32
    Points
    32
    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 éclairé Avatar de jkofr
    Homme Profil pro
    Senior Consultant DBA (Trivadis SA)
    Inscrit en
    Octobre 2006
    Messages
    484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Suisse

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 484
    Points : 724
    Points
    724
    Par défaut
    okidoki! capito!

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

  7. #7
    Nouveau membre du Club
    Inscrit en
    Août 2010
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 77
    Points : 32
    Points
    32
    Par défaut
    ???

  8. #8
    Membre éclairé Avatar de jkofr
    Homme Profil pro
    Senior Consultant DBA (Trivadis SA)
    Inscrit en
    Octobre 2006
    Messages
    484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Suisse

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 484
    Points : 724
    Points
    724
    Par défaut
    Citation Envoyé par molo1987 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Nouveau membre du Club
    Inscrit en
    Août 2010
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 77
    Points : 32
    Points
    32
    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 éclairé Avatar de jkofr
    Homme Profil pro
    Senior Consultant DBA (Trivadis SA)
    Inscrit en
    Octobre 2006
    Messages
    484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Suisse

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 484
    Points : 724
    Points
    724
    Par défaut
    Voici une option:

    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
     
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Nouveau membre du Club
    Inscrit en
    Août 2010
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 77
    Points : 32
    Points
    32
    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 éclairé Avatar de jkofr
    Homme Profil pro
    Senior Consultant DBA (Trivadis SA)
    Inscrit en
    Octobre 2006
    Messages
    484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Suisse

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 484
    Points : 724
    Points
    724
    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
    Nouveau membre du Club
    Inscrit en
    Août 2010
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 77
    Points : 32
    Points
    32
    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 éclairé Avatar de jkofr
    Homme Profil pro
    Senior Consultant DBA (Trivadis SA)
    Inscrit en
    Octobre 2006
    Messages
    484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Suisse

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 484
    Points : 724
    Points
    724
    Par défaut
    ok,

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

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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
     
     
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Nouveau membre du Club
    Inscrit en
    Août 2010
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 77
    Points : 32
    Points
    32
    Par défaut
    Question : c'est quoi cet id ? Sinon comment faire pour le nombre d'articles.
    Merci beaucoup.

  16. #16
    Membre éclairé Avatar de jkofr
    Homme Profil pro
    Senior Consultant DBA (Trivadis SA)
    Inscrit en
    Octobre 2006
    Messages
    484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Suisse

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 484
    Points : 724
    Points
    724
    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
    Nouveau membre du Club
    Inscrit en
    Août 2010
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 77
    Points : 32
    Points
    32
    Par défaut
    est ce que je peux le remplacer par produit?

  18. #18
    Membre éclairé Avatar de jkofr
    Homme Profil pro
    Senior Consultant DBA (Trivadis SA)
    Inscrit en
    Octobre 2006
    Messages
    484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Suisse

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 484
    Points : 724
    Points
    724
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

Discussions similaires

  1. Requête SQL de recherche un peu compliquée
    Par ned-flanders dans le forum Langage SQL
    Réponses: 5
    Dernier message: 08/04/2013, 14h25
  2. [PHP 5.2] Résultat d'une requête dans un tableau un peu compliqué
    Par renaud26 dans le forum Langage
    Réponses: 7
    Dernier message: 31/03/2011, 06h28
  3. Requête un peu compliquée
    Par tchem dans le forum Requêtes
    Réponses: 17
    Dernier message: 06/03/2009, 08h58
  4. [SQL - ORACLE] Requete un peu compliquée (pour moi)
    Par Worldofdada dans le forum Langage SQL
    Réponses: 15
    Dernier message: 03/11/2005, 08h25
  5. Requête un peu trop compliqué pour moi
    Par Kokito dans le forum Langage SQL
    Réponses: 5
    Dernier message: 18/04/2005, 15h17

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