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

 Oracle Discussion :

Remplir une table selon des pourcentages


Sujet :

Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 86
    Points : 54
    Points
    54
    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.

  2. #2
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 86
    Points : 54
    Points
    54
    Par défaut
    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

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Il faut jouer avec une requête pour générer des nombres, et utiliser la fonction modulo :
    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
    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.

  5. #5
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    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 : 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
     
    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
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 86
    Points : 54
    Points
    54
    Par défaut
    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.

  7. #7
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Waouuh! comment elle me plait ta solution Waldar!

  8. #8
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    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
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  9. #9
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    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

  10. #10
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    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.

  11. #11
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    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
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 86
    Points : 54
    Points
    54
    Par défaut
    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 : 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
     
    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

  13. #13
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    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
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 86
    Points : 54
    Points
    54
    Par défaut
    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.

  15. #15
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    la fonction + ou - sur une date permet d'ajouter ou enlever un nombre (avec décimales) de jour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 86
    Points : 54
    Points
    54
    Par défaut
    merci McM pour ta réponse.

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

    à bientôt.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 02/01/2014, 11h21
  2. trier une table sur des pourcentages
    Par chris0938 dans le forum jQuery
    Réponses: 8
    Dernier message: 01/06/2010, 15h53
  3. [MySQL] Remplir une table avec des données déjà existantes
    Par Bruno.C dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 08/07/2008, 08h28
  4. remplir une table avec des données aléatoire
    Par jamal_id dans le forum SQL
    Réponses: 3
    Dernier message: 17/10/2007, 10h11
  5. remplir une table en fonction des résultats
    Par Psychomantis dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 19/10/2004, 12h22

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