Précédent   Forum du club des développeurs et IT Pro > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 02/01/2013, 23h06   #1
molo1987
Invité de passage
 
Inscription : août 2010
Messages : 75
Détails du profil
Informations forums :
Inscription : août 2010
Messages : 75
Points : 4
Points : 4
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 ?
molo1987 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2013, 09h34   #2
islamov2000
Membre chevronné
 
Avatar de islamov2000
 
Homme islamov islamov
Ingénieur d'études & developpement en informatique
Inscription : septembre 2007
Messages : 465
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 : 465
Points : 642
Points : 642
Envoyer un message via Yahoo à islamov2000 Envoyer un message via Skype™ à islamov2000
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.
islamov2000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2013, 14h38   #3
molo1987
Invité de passage
 
Inscription : août 2010
Messages : 75
Détails du profil
Informations forums :
Inscription : août 2010
Messages : 75
Points : 4
Points : 4
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)
)
molo1987 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2013, 18h10   #4
jkofr
Membre éprouvé
 
Avatar de jkofr
 
Homme Jacques Kostic
Senior Consultant DBA (Trivadis SA)
Inscription : octobre 2006
Messages : 369
Détails du profil
Informations personnelles :
Nom : Homme Jacques Kostic
Âge : 44
Localisation : Suisse

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

Informations forums :
Inscription : octobre 2006
Messages : 369
Points : 482
Points : 482
Envoyer un message via MSN à jkofr
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
__________________
OCP 11g, RAC and Performance & Tuning Expert 11g
RMAN Backup & Recovery, Data Guard and Grid Control
jkofr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2013, 18h17   #5
molo1987
Invité de passage
 
Inscription : août 2010
Messages : 75
Détails du profil
Informations forums :
Inscription : août 2010
Messages : 75
Points : 4
Points : 4
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
molo1987 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2013, 18h39   #6
jkofr
Membre éprouvé
 
Avatar de jkofr
 
Homme Jacques Kostic
Senior Consultant DBA (Trivadis SA)
Inscription : octobre 2006
Messages : 369
Détails du profil
Informations personnelles :
Nom : Homme Jacques Kostic
Âge : 44
Localisation : Suisse

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

Informations forums :
Inscription : octobre 2006
Messages : 369
Points : 482
Points : 482
Envoyer un message via MSN à jkofr
okidoki! capito!

jko
__________________
OCP 11g, RAC and Performance & Tuning Expert 11g
RMAN Backup & Recovery, Data Guard and Grid Control
jkofr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2013, 18h45   #7
molo1987
Invité de passage
 
Inscription : août 2010
Messages : 75
Détails du profil
Informations forums :
Inscription : août 2010
Messages : 75
Points : 4
Points : 4
???
molo1987 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2013, 18h51   #8
jkofr
Membre éprouvé
 
Avatar de jkofr
 
Homme Jacques Kostic
Senior Consultant DBA (Trivadis SA)
Inscription : octobre 2006
Messages : 369
Détails du profil
Informations personnelles :
Nom : Homme Jacques Kostic
Âge : 44
Localisation : Suisse

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

Informations forums :
Inscription : octobre 2006
Messages : 369
Points : 482
Points : 482
Envoyer un message via MSN à jkofr
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
__________________
OCP 11g, RAC and Performance & Tuning Expert 11g
RMAN Backup & Recovery, Data Guard and Grid Control
jkofr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2013, 18h58   #9
molo1987
Invité de passage
 
Inscription : août 2010
Messages : 75
Détails du profil
Informations forums :
Inscription : août 2010
Messages : 75
Points : 4
Points : 4
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
molo1987 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2013, 20h12   #10
jkofr
Membre éprouvé
 
Avatar de jkofr
 
Homme Jacques Kostic
Senior Consultant DBA (Trivadis SA)
Inscription : octobre 2006
Messages : 369
Détails du profil
Informations personnelles :
Nom : Homme Jacques Kostic
Âge : 44
Localisation : Suisse

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

Informations forums :
Inscription : octobre 2006
Messages : 369
Points : 482
Points : 482
Envoyer un message via MSN à jkofr
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
__________________
OCP 11g, RAC and Performance & Tuning Expert 11g
RMAN Backup & Recovery, Data Guard and Grid Control
jkofr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2013, 22h32   #11
molo1987
Invité de passage
 
Inscription : août 2010
Messages : 75
Détails du profil
Informations forums :
Inscription : août 2010
Messages : 75
Points : 4
Points : 4
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.
molo1987 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2013, 23h27   #12
jkofr
Membre éprouvé
 
Avatar de jkofr
 
Homme Jacques Kostic
Senior Consultant DBA (Trivadis SA)
Inscription : octobre 2006
Messages : 369
Détails du profil
Informations personnelles :
Nom : Homme Jacques Kostic
Âge : 44
Localisation : Suisse

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

Informations forums :
Inscription : octobre 2006
Messages : 369
Points : 482
Points : 482
Envoyer un message via MSN à jkofr
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
__________________
OCP 11g, RAC and Performance & Tuning Expert 11g
RMAN Backup & Recovery, Data Guard and Grid Control
jkofr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2013, 18h46   #13
molo1987
Invité de passage
 
Inscription : août 2010
Messages : 75
Détails du profil
Informations forums :
Inscription : août 2010
Messages : 75
Points : 4
Points : 4
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.
molo1987 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 05/01/2013, 22h03   #14
jkofr
Membre éprouvé
 
Avatar de jkofr
 
Homme Jacques Kostic
Senior Consultant DBA (Trivadis SA)
Inscription : octobre 2006
Messages : 369
Détails du profil
Informations personnelles :
Nom : Homme Jacques Kostic
Âge : 44
Localisation : Suisse

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

Informations forums :
Inscription : octobre 2006
Messages : 369
Points : 482
Points : 482
Envoyer un message via MSN à jkofr
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
__________________
OCP 11g, RAC and Performance & Tuning Expert 11g
RMAN Backup & Recovery, Data Guard and Grid Control
jkofr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2013, 22h18   #15
molo1987
Invité de passage
 
Inscription : août 2010
Messages : 75
Détails du profil
Informations forums :
Inscription : août 2010
Messages : 75
Points : 4
Points : 4
Question : c'est quoi cet id ? Sinon comment faire pour le nombre d'articles.
Merci beaucoup.
molo1987 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2013, 22h35   #16
jkofr
Membre éprouvé
 
Avatar de jkofr
 
Homme Jacques Kostic
Senior Consultant DBA (Trivadis SA)
Inscription : octobre 2006
Messages : 369
Détails du profil
Informations personnelles :
Nom : Homme Jacques Kostic
Âge : 44
Localisation : Suisse

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

Informations forums :
Inscription : octobre 2006
Messages : 369
Points : 482
Points : 482
Envoyer un message via MSN à jkofr
Ben c'est ton id de commande.
__________________
OCP 11g, RAC and Performance & Tuning Expert 11g
RMAN Backup & Recovery, Data Guard and Grid Control
jkofr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2013, 22h45   #17
molo1987
Invité de passage
 
Inscription : août 2010
Messages : 75
Détails du profil
Informations forums :
Inscription : août 2010
Messages : 75
Points : 4
Points : 4
est ce que je peux le remplacer par produit?
molo1987 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2013, 09h33   #18
jkofr
Membre éprouvé
 
Avatar de jkofr
 
Homme Jacques Kostic
Senior Consultant DBA (Trivadis SA)
Inscription : octobre 2006
Messages : 369
Détails du profil
Informations personnelles :
Nom : Homme Jacques Kostic
Âge : 44
Localisation : Suisse

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

Informations forums :
Inscription : octobre 2006
Messages : 369
Points : 482
Points : 482
Envoyer un message via MSN à jkofr
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
__________________
OCP 11g, RAC and Performance & Tuning Expert 11g
RMAN Backup & Recovery, Data Guard and Grid Control
jkofr est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 17h15.


 
 
 
 
Partenaires

Hébergement Web