Précédent   Forum des professionnels en informatique > Bases de données > Oracle > Débuter
Débuter Forum d'entraide pour débuter avec 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 28/12/2011, 15h07   #1
Futur Membre du Club
 
Inscription : décembre 2011
Messages : 60
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 60
Points : 18
Points : 18
Par défaut Remplir une table selon des pourcentages

bonjour,

j'aimerai savoir si quelqu'un à une idée de comment entamé le problème ci-dessous?

le problème : nous disposons d'une base avec 5 tables et nous souhaitons faire des insertions automatique selon des pourcentages donnés.
nous avons une table plats, cuisinier, restaurant, buffet et serveur.
...
plats(id, entrée, principal, dessert, ...);
...
la base de données sera remplie avec une proportion maitrisée des plats par entrée, principal et dessert. les portion sont les suivantes :
entrée : Carpaccio(10%), soupe(20%), salade(40%), Terrine(10%), Risotto(20%).
principal : grillade(20%), poulet(20%), viande(40%), pâtes(10%), poisson(10%).
dessert : pâtisserie(30%), fruits(30%), boisson(40%).

quelqu'un aurai une idée? comment je peux faire ces insertions?

merci.

NB : je suis nouveau sur le forum et je vous demande de m'excuser si jamais j'ai fais une erreur ou que j'explique mal mon problème.
wassim_boy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2011, 17h12   #2
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 440
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 440
Points : 4 183
Points : 4 183
Tu fais 10 insertions dans la table plat :
En entrée, tu mets Carpaccio dans la première, Soupe dans les 2 insertions suivantes, Salade dans les 4 suivantes, Terrine dans la suivante et Risotto dans les 2 dernières.

En Principal tu mets Grillade dans les 2 premières, Poulet dans les 2 suivantes, Viande dans les 4 suivantes, pâtes dans la suivante et poisson dans la dernière
etc..

Ce qui donne
Code :
1
2
3
4
5
6
7
8
9
10
INSERT INTO plat(id, entree, principal, dessert) VALUES(1,'Carpaccio','Grillade','Pâtisserie');
INSERT INTO plat(id, entree, principal, dessert) VALUES(2,'Soupe','Grillade','Pâtisserie');
INSERT INTO plat(id, entree, principal, dessert) VALUES(3,'Soupe','Poulet','Pâtisserie');
INSERT INTO plat(id, entree, principal, dessert) VALUES(4,'Salade','Poulet','Fruits');
INSERT INTO plat(id, entree, principal, dessert) VALUES(5,'Salade','Viande','Fruits');
INSERT INTO plat(id, entree, principal, dessert) VALUES(6,'Salade','Viande','Fruits');
INSERT INTO plat(id, entree, principal, dessert) VALUES(7,'Salade','Viande','Boisson');
INSERT INTO plat(id, entree, principal, dessert) VALUES(8,'Terrine','Viande','Boisson');
INSERT INTO plat(id, entree, principal, dessert) VALUES(9,'Risotto','Pâtes','Boisson');
INSERT INTO plat(id, entree, principal, dessert) VALUES(10,'Risotto','Poisson','Boisson');
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2011, 17h48   #3
Futur Membre du Club
 
Inscription : décembre 2011
Messages : 60
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 60
Points : 18
Points : 18
merci pour ta réponse

le problème c'est que il nous demande de remplir la table avec 500 tuples en respectant ces pourcentages. je pense pas qu'il attend de nous d'écrire 500 lignes de insert into. qu'est ce que vous en pensez?

il doit y avoir une solution qui nous évite à les écrire mais je n'ai aucune piste pour l'instant

à bientôt
wassim_boy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2011, 18h04   #4
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 686
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 686
Points : 10 435
Points : 10 435
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Il faut jouer avec une requête pour générer des nombres, et utiliser la fonction modulo :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
INSERT INTO plat (id, entree, principal, dessert)
    SELECT level AS id
         , case
             when mod(level, 10) = 1             then 'Carpaccio'
             when mod(level, 10) IN (2, 3)       then 'Soupe'
             when mod(level, 10) IN (4, 5, 6, 7) then 'Salade'
             when mod(level, 10) = 8             then 'Terrine'
             when mod(level, 10) IN (9, 0)       then 'Risotto'
           end AS entree
         , case
             when mod(level, 10) IN (1, 2)       then 'Grillade'
             when mod(level, 10) IN (3, 4)       then 'Poulet'
             when mod(level, 10) IN (5, 6, 7, 8) then 'Viande'
             when mod(level, 10) = 9             then 'Pâtes'
             when mod(level, 10) = 0             then 'Poisson'
           end AS principal
         , case
             when mod(level, 10) IN (1, 2, 3)    then 'Pâtisserie'
             when mod(level, 10) IN (4, 5, 6)    then 'Fruits'
             when mod(level, 10) IN (7, 8, 9, 0) then 'Boisson'
           end AS dessert
      FROM dual
connect BY level <= 500;
Les données ne sont pas super originales, mais l'objectif sera atteint.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 28/12/2011, 18h10   #5
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 440
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 440
Points : 4 183
Points : 4 183
Je m'en doutais un peu.
Ton but est donc de créer une procédure qui insère aléatoirement des données en respectant un %
Utilises donc dbms_random pour avoir un aléatoire et générer tes insertions
exemple simplifié de code
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
FOR i IN 1..500
LOOP
pct := DBMS_RANDOM.VALUE(0, 100);
IF pct < 10 then v_entree := 'Carpaccio';
ELSIF pct < 30 then v_entree := 'Soupe';
ELSIF pct < 70 then v_entree := 'Salade';
ELSIF pct < 80 then v_entree := 'Terrine';
ELSE v_entree := 'Risotto'; 
END IF;
 
pct := DBMS_RANDOM.VALUE(0, 100);
.. pareil pour les plats
 
pct := DBMS_RANDOM.VALUE(0, 100);
.. pareil pour les dessert
 
INSERT INTO PLAT(id, entree, plat, dessert)
VALUES (i, v_entree, v_plat, v_dessert);
 
END LOOP;
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/12/2011, 19h13   #6
Futur Membre du Club
 
Inscription : décembre 2011
Messages : 60
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 60
Points : 18
Points : 18
merci pour vos réponses.

au fait une procédure c'est une solution idéale et je vais la garder mais je viens d'apprendre que apparemment il veut qu'on utilise des requêtes et une table temporaire pour résoudre ce problème.

pour l'instant je ne sais pas si c'est faisable et je n'ai aucune idée de comment le faire donc pour le moment je vais suivre l'idée de la procédure.

encore merci et à bientôt.
wassim_boy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 15h05   #7
Membre Expert
 
Inscription : avril 2006
Messages : 1 024
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 024
Points : 1 175
Points : 1 175
Waouuh! comment elle me plait ta solution Waldar!
remi4444 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 15h33   #8
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 440
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 440
Points : 4 183
Points : 4 183
La solution de Waldar nécessite une 10g (et n'a pas d'aléatoire, mais on peut le rajouter)
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 15h52   #9
Membre Expert
 
Inscription : avril 2006
Messages : 1 024
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 024
Points : 1 175
Points : 1 175
En même temps, ce qui est demandé c'est une proportion, pas de l'aléatoire (qui va forcément s'écarter un peu des proportions requises.)

Enfin moi, j'avais un jugement purement esthétique
remi4444 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 16h28   #10
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 686
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 686
Points : 10 435
Points : 10 435
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Tout-à-fait, les données de la requête que j'ai proposée sont très figées.
Si c'est limitant on peut d'amuser avec dbms_random.

Par contre ça fonctionne en 9i l'astuce connect by level.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2011, 11h14   #11
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 440
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 440
Points : 4 183
Points : 4 183
Chez moi en 9.2.0.7 le connect by level ne marche pas (Oracle ne renvoie qu'une seule ligne)
Sur une 10.2 c'est bon.
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/12/2011, 02h18   #12
Futur Membre du Club
 
Inscription : décembre 2011
Messages : 60
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 60
Points : 18
Points : 18
bonjour,

alors j'ai réussi à remplir ma table avec les pourcentages souhaité en modifiant le solution proposé par McM que je remercie à l'occasion. voici le code :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
BEGIN
	WHILE cpt < nb
    LOOP
 
		pct := cpt/nb*100;
 
		IF pct <= 10.0 then v_entree:= 'Carpaccio';
		ELSIF pct <= 50.0 then v_entree := 'Soupe';
		ELSIF pct <= 55.0 then v_entree := 'Salade';
		ELSIF pct <= 80.0 then v_entree := 'Terrine';
		ELSE v_entree := 'Risotto'; 
		END IF;
 
		.. pareil pour les plats principal
 
		.. pareil pour les desserts
 
		INSERT INTO plat VALUES (cpt, to_date('01/11/2012','dd/mm/yyyy'), 100, 'jean', v_entree,v_principal, v_dessert);	 
   	cpt := cpt + 1;
	END LOOP;
je suis maintenant face à un nouveau problème ! j'aimerai que la date, le prix et le nom du cuisinier soient aléatoire (sans respecter aucun pourcentage) ainsi j'aurai pas la même valeur à chaque fois.

je me demande si quelqu'un aurait une idée? svp

merci et à bientôt
wassim_boy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2012, 14h18   #13
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 440
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 440
Points : 4 183
Points : 4 183
Heu.. aléatoire : Dbms_random, c'est tout.
Il faut juste associer un retour numérique à un nom (cuisinier), pour le reste c'est facile, ce sont des nombre (la date, suffit juste de rajouter X jours à une date mini)
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2012, 21h26   #14
Futur Membre du Club
 
Inscription : décembre 2011
Messages : 60
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 60
Points : 18
Points : 18
bonsoir,

j'ai fait une fonction PL/SQL, une pour le prix et une pour le nom du cuisinier, qui retourne une valeur aléatoire mais pour la date je sais pas comment faire sachant que je ne sais pas manipuler les dates

merci et à bientôt.
wassim_boy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 14h21   #15
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 440
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 440
Points : 4 183
Points : 4 183
la fonction + ou - sur une date permet d'ajouter ou enlever un nombre (avec décimales) de jour
Code :
1
2
3
4
5
SELECT sysdate h, sysdate + 1/24 h_plus_1, sysdate +1 j_plus_1, trunc(sysdate) + 1 + 12/24 demain_midi
FROM dual
 
H				H_PLUS_1	J_PLUS_1			DEMAIN_MIDI
05/01/2012 14:21:18	05/01/2012 15:21:18	06/01/2012 14:21:18	06/01/2012 12:00:00
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 15h46   #16
Futur Membre du Club
 
Inscription : décembre 2011
Messages : 60
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 60
Points : 18
Points : 18
merci McM pour ta réponse.

je vais utiliser ta solution et je posterai la fonction qui retourne une date aléatoire.

à bientôt.
wassim_boy est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



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


 
 
 
 
Partenaires

Hébergement Web