Précédent   Forum des professionnels en informatique > 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 Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/02/2011, 13h47   #1
Invité de passage
 
Benjamine
Inscription : février 2011
Messages : 4
Détails du profil
Informations personnelles :
Nom : Benjamine
Localisation : France

Informations forums :
Inscription : février 2011
Messages : 4
Points : 0
Points : 0
Par défaut Select avec 3 tables

Bonjour à tous,
Je suis novice et désolée si je fais quelques erreurs.
Mon problème c'est que j'ai 3 tables, l'une commande, l'autre sur les détails d'une commende et la dernière les fournisseurs potentiels.
Je dois sortir dans une requête la liste de toutes les commandes avec leur détails et les fournisseurs potentiels
Voici la structure des tables

Table commande :
N°commande : cmd_code
Qté commandée : cmd_qte
Fournisseur : cmd_fou
Type de commande : cmd_type

Table détails:
N°commande : cmd_code
N°détail commande : cmdd_code
Emetteur commande : cmdd_emetteur
Indicatif : cmdd_indic

Table prix:
N°détail commande : cmdd_code
Fournisseur : prix_fou
Prix : prix_valeur

Dans la table prix, il peut y avoir aucun jusqu'à 3 fournisseurs
Si c'était un seul fournisseur, j'aurai pas eu de problème mais quand il y a 2 ou 3 c'est la galère

J'ai fait cette requête
Code :
1
2
3
4
5
6
7
8
9
10
SELECT cmd.cdm_code, cmd.cmd_qte, cmd.cmd_fou, cmd.cmd_type,
cmdd.cmdd_code, cmdd.cmdd_emetteur, cmdd.cmdd_indic,
(SELECT cmdprix.prix_fou FROM prix cmdprix
WHERE cmdprix.cmdd_code = cmdd.cmdd_code
AND rownum = 1) fournisseur
FROM commande cmd INNER JOIN details cmdd ON
cmd.cmd_code = cmdd.cmd_code
INNER JOIN prix cmdprix ON 
cmdd.cmdd_code = cmdprix.cmdd_code
ORDER BY 1
ça marche si il n'y a aucun ou un seul fournisseur dans la table prix.
Comment fait-on quand on veut mettre dans la colonne suivante le deuxième fournisseur?
J'ai regardé dans d'autre discussion et c'est pour ça que j'ai éssayé avec rownum mais je cale.
merci pour votre aide,
Benjamine
benjamine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2011, 19h23   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 459
Points : 10 459
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Citation:
Comment fait-on quand on veut mettre dans la colonne suivante le deuxième fournisseur?
Qu'entendez-vous par cette phrase ?
Si une commande a plusieurs fournisseurs vous voulez rajouter des colonnes ou bien rajouter des lignes ?
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2011, 06h10   #3
Invité de passage
 
Benjamine
Inscription : février 2011
Messages : 4
Détails du profil
Informations personnelles :
Nom : Benjamine
Localisation : France

Informations forums :
Inscription : février 2011
Messages : 4
Points : 0
Points : 0
Citation:
Envoyé par Waldar Voir le message
Si une commande a plusieurs fournisseurs vous voulez rajouter des colonnes ou bien rajouter des lignes ?
Et bien je veux rajouter des colonnes c'est-à-dire mettre le second fournisseur potentiel fournisseur2 dans une colonne juste après fournisseur comme suit

Code :
1
2
3
4
5
6
7
8
9
10
SELECT cmd.cdm_code, cmd.cmd_qte, cmd.cmd_fou, cmd.cmd_type,
cmdd.cmdd_code, cmdd.cmdd_emetteur, cmdd.cmdd_indic,
(SELECT cmdprix.prix_fou FROM prix cmdprix
WHERE cmdprix.cmdd_code = cmdd.cmdd_code
AND rownum = 1) fournisseur, fournisseur2
FROM commande cmd INNER JOIN details cmdd ON
cmd.cmd_code = cmdd.cmd_code
INNER JOIN prix cmdprix ON 
cmdd.cmdd_code = cmdprix.cmdd_code
ORDER BY 1
Merci à vous
benjamine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2011, 09h23   #4
Membre émérite
 
Avatar de Drizzt [Drone38]
 
Homme
Inscription : mai 2004
Messages : 739
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : mai 2004
Messages : 739
Points : 979
Points : 979
Il y a probablement plus simple, mais en attendant que quelqu'un te donne une autre réponse voici une solution qui devrait pouvoir fonctionner :

Code :
1
2
3
4
5
6
7
8
9
10
SELECT DISTINCT 
  cmd.cdm_code, cmd.cmd_qte, cmd.cmd_fou, cmd.cmd_type,
  cmdd.cmdd_code, cmdd.cmdd_emetteur, cmdd.cmdd_indic,
  first_value(cmdprix.prix_fou) over(partition BY cmdprix.cmdd_code ORDER BY cmdprix.prix_fou) fournisseur,
  lag(cmdprix.prix_fou,1) over(partition BY cmdprix.cmdd_code ORDER BY cmdprix.prix_fou) fournisseur2,
  lag(cmdprix.prix_fou,2) over(partition BY cmdprix.cmdd_code ORDER BY cmdprix.prix_fou) fournisseur3,
FROM commande cmd 
   INNER JOIN details cmdd ON cmd.cmd_code = cmdd.cmd_code
   INNER JOIN prix cmdprix ON  cmdd.cmdd_code = cmdprix.cmdd_code
ORDER BY 1
Je n'ai pas accès à une BDD actuellement donc je n'ai pas pu tester, mais de mémoire ça devrait être ça.
Note il faut Oracle 8i au minimum.
__________________
Je ne réponds pas aux questions techniques par MP, le forum est là pour cela.

La crypto c'est comme les flambys, une fois que tu as trouvé la languette tu as juste à tirer pour tout faire tomber.

(\ _ /)
(='.'=)
Voici Lapinou. Aidez le à conquérir le monde
(")-(") en le reproduisant
Drizzt [Drone38] est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/02/2011, 16h27   #5
Invité de passage
 
Benjamine
Inscription : février 2011
Messages : 4
Détails du profil
Informations personnelles :
Nom : Benjamine
Localisation : France

Informations forums :
Inscription : février 2011
Messages : 4
Points : 0
Points : 0
Par défaut Merci

Merci beaucoup ça marche impec
PS: je travaille avec Oracle 10
benjamine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2011, 14h32   #6
Invité de passage
 
Benjamine
Inscription : février 2011
Messages : 4
Détails du profil
Informations personnelles :
Nom : Benjamine
Localisation : France

Informations forums :
Inscription : février 2011
Messages : 4
Points : 0
Points : 0
En fait il y a encore un problème
Le résultat n'affiche pas la liste des commandes où les fournisseurs potentiels sont nuls.
J'ai tenté de faire :
Code :
1
2
3
4
5
6
7
8
9
10
SELECT DISTINCT 
  cmd.cdm_code, cmd.cmd_qte, cmd.cmd_fou, cmd.cmd_type,
  cmdd.cmdd_code, cmdd.cmdd_emetteur, cmdd.cmdd_indic,
  nvl(first_value(cmdprix.prix_fou) over(partition BY cmdprix.cmdd_code ORDER BY cmdprix.prix_fou),'') fournisseur,
  nvl(lag(cmdprix.prix_fou,1) over(partition BY cmdprix.cmdd_code ORDER BY cmdprix.prix_fou),'') fournisseur2,
  nvl(lag(cmdprix.prix_fou,2) over(partition BY cmdprix.cmdd_code ORDER BY cmdprix.prix_fou),'') fournisseur3,
FROM commande cmd 
   INNER JOIN details cmdd ON cmd.cmd_code = cmdd.cmd_code
   INNER JOIN prix cmdprix ON  cmdd.cmdd_code = cmdprix.cmdd_code
ORDER BY 1
mais sans succès
Toute suggestion est la bienvenue
Merci
benjamine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2011, 09h54   #7
Membre émérite
 
Avatar de Drizzt [Drone38]
 
Homme
Inscription : mai 2004
Messages : 739
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : mai 2004
Messages : 739
Points : 979
Points : 979
Il faut que tu ouvres ta jointure sur la table prix. (LEFT OUTER JOIN)
__________________
Je ne réponds pas aux questions techniques par MP, le forum est là pour cela.

La crypto c'est comme les flambys, une fois que tu as trouvé la languette tu as juste à tirer pour tout faire tomber.

(\ _ /)
(='.'=)
Voici Lapinou. Aidez le à conquérir le monde
(")-(") en le reproduisant
Drizzt [Drone38] est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h13.


 
 
 
 
Partenaires

Hébergement Web