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

Langage SQL Discussion :

[Procédure Stockée] mettre à jour plusieurs lignes


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de PoichOU
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juillet 2006
    Messages : 328
    Par défaut [Procédure Stockée] mettre à jour plusieurs lignes
    Bonjour,


    Admettons que j'ai la table suivante :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    --------------------------------------------------------------
    | id | Famille |   Type   | Sous_type | Qte | P_ST_T | P_T_F |
    --------------------------------------------------------------
    |  1 | Fruit   |   Orange | Mandarine |  2  | NULL   | NULL  |
    |  2 | Fruit   |   Orange | Clementine| 10  | NULL   | NULL  |
    |  3 | Fruit   |   Orange | Sanguine  |  8  | NULL   | NULL  |
    |  4 | Fruit   |   Pomme  | Granny    | 20  | NULL   | NULL  |
    |  5 | Fruit   |   Pomme  | Golden    |  8  | NULL   | NULL  |
    |  5 | Fruit   |   Pomme  | Rouge     | 12  | NULL   | NULL  |
    --------------------------------------------------------------
    Je voudrais remplir les colonnes P_ST_T, P_T_F et P_F où :
    - P_ST_T est le pourcentage de quantité de sous_type par rapport à un type
    - P_T_F est le pourcentage de quantité d'un type par rapport à une famille



    exemple pour l'id 1 :
    P_ST_T = Qté Mandarine / Qté Orange * 100
    P_ST_T = 2 / 20 * 100
    P_ST_T = 10

    P_T_F = Qté Orange / Qté Fruit * 100
    P_T_F = 20 / 60 * 100
    P_T_F = 33,33


    Il faut faire ce calcul pour chaque ligne et les mettre à jour.

    C'est-à-dire obtenir le tableau suivant :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    --------------------------------------------------------------
    | id | Famille |   Type   | Sous_type | Qte | P_ST_T | P_T_F | 
    --------------------------------------------------------------
    |  1 | Fruit   |   Orange | Mandarine |  2  |   10   | 33.33 | 
    |  2 | Fruit   |   Orange | Clementine| 10  |   50   | 33.33 |
    |  3 | Fruit   |   Orange | Sanguine  |  8  |   40   | 33.33 |
    |  4 | Fruit   |   Pomme  | Granny    | 20  |   50   | 66.67 |
    |  5 | Fruit   |   Pomme  | Golden    |  8  |   20   | 66.67 |
    |  5 | Fruit   |   Pomme  | Rouge     | 12  |   30   | 66.67 |
    --------------------------------------------------------------

    Est-il possible de faire ça avec une procèdure stockée ?


    Merci

    PoichOU

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    Il suffit de calculer les totaux dans des tables dérivées :
    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
    24
    25
    26
    27
    28
    29
    30
    select    X.ID 
        ,    X.FAMILLE
        ,    X.TYPE
        ,    X.SOUS_TYPE
        ,    X.QTE
        ,    (ST.QTE / T.QTE)    as P_ST_T
        ,    (T.QTE / F.QTE)    as P_T_F 
    from    MATABLE    as X
        inner join
            (    select    SOUS_TYPE
                    ,    sum(QTE)    as QTE
                from    MATABLE
                group by    SOUS_TYPE
            )    as ST
            on    X.SOUS_TYPE = ST.SOUS_TYPE
        inner join
            (    select    TYPE
                    ,    sum(QTE)    as QTE
                from    MATABLE
                group by    TYPE
            )    as T
            on    X.TYPE = F.TYPE
        inner join
            (    select    FAMILLE
                    ,    sum(QTE)    as QTE
                from    MATABLE
                group by    FAMILLE
            )    as F
            on    X.FAMILLE = F.FAMILLE
    ;
    On peut aussi le faire sans tables dérivées en utilisant les fonctions de regroupement analytiques...
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    Citation Envoyé par al1_24
    On peut aussi le faire sans tables dérivées en utilisant les fonctions de regroupement analytiques...
    Comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select    ID 
        ,    FAMILLE
        ,    TYPE
        ,    SOUS_TYPE
        ,    QTE
        ,    (sum(QTE) over(partition by SOUS_TYPE) / sum(QTE) over(partition by TYPE))    as P_ST_T
        ,    (sum(QTE) over(partition by TYPE) / sum(QTE) over(partition by FAMILLE))    as P_T_F 
    from    MATABLE
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  4. #4
    Membre éclairé Avatar de PoichOU
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juillet 2006
    Messages : 328
    Par défaut
    Ouahou !! j'suis bluffé par les soluces !


    j'ai même trouvé une p'tite erreur dans la première soluce (preuve que je l'ai comprise)
    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
    24
    25
    26
    27
    28
    29
    30
    SELECT    X.ID 
        ,    X.FAMILLE
        ,    X.TYPE
        ,    X.SOUS_TYPE
        ,    X.QTE
        ,    (ST.QTE / T.QTE)    AS P_ST_T
        ,    (T.QTE / F.QTE)    AS P_T_F 
    FROM    MATABLE    AS X
        INNER JOIN
            (    SELECT    SOUS_TYPE
                    ,    sum(QTE)    AS QTE
                FROM    MATABLE
                GROUP BY    SOUS_TYPE
            )    AS ST
            ON    X.SOUS_TYPE = ST.SOUS_TYPE
        INNER JOIN
            (    SELECT    TYPE
                    ,    sum(QTE)    AS QTE
                FROM    MATABLE
                GROUP BY    TYPE
            )    AS T
            ON    X.TYPE = T.TYPE
        INNER JOIN
            (    SELECT    FAMILLE
                    ,    sum(QTE)    AS QTE
                FROM    MATABLE
                GROUP BY    FAMILLE
            )    AS F
            ON    X.FAMILLE = F.FAMILLE
    ;
    merci al1_24 pour tes réponses aussi bonnes et rapide

    Il me reste plus qu'à trouver comment faire ça dans une procèdure stockée...

  5. #5
    Membre éclairé Avatar de PoichOU
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juillet 2006
    Messages : 328
    Par défaut
    Quelqu'un connait un bon tuto qui explique comment créer une procèdure stockée ?

    Je voudrais mettre à jour chaque ligne de la table.

    Pour info, j'utilise une base de données Oracle.

    Voici le sript de création de la table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    create table TUTOS_PROC_STOCKEE  (
    	ID 		INTEGER 	not null,
    	FAMILLE		VARCHAR2(20)	not null,
    	TYPE		VARCHAR2(20)	not null,
    	SOUS_TYPE	VARCHAR2(20)	not null,
    	QUANTITE	NUMBER		not null,
    	P_ST_T 		NUMBER,
    	P_T_F 		NUMBER,
        primary key (ID)
    );

    Voici le sript d'initialisation des données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    insert into TUTOS_PROC_STOCKEE (ID,FAMILLE, TYPE, SOUS_TYPE, QUANTITE, P_ST_T, P_T_F) 
    values (1, 'Fruit', 'Orange', 'Mandarine', 2, NULL, NULL);
    insert into TUTOS_PROC_STOCKEE (ID,FAMILLE, TYPE, SOUS_TYPE, QUANTITE, P_ST_T, P_T_F) 
    values (2, 'Fruit', 'Orange', 'Clementine', 10, NULL, NULL);
    insert into TUTOS_PROC_STOCKEE (ID,FAMILLE, TYPE, SOUS_TYPE, QUANTITE, P_ST_T, P_T_F) 
    values (3, 'Fruit', 'Orange', 'Sanguine', 8, NULL, NULL);
    insert into TUTOS_PROC_STOCKEE (ID,FAMILLE, TYPE, SOUS_TYPE, QUANTITE, P_ST_T, P_T_F) 
    values (4, 'Fruit', 'Pomme', 'Granny', 20, NULL, NULL);
    insert into TUTOS_PROC_STOCKEE (ID,FAMILLE, TYPE, SOUS_TYPE, QUANTITE, P_ST_T, P_T_F) 
    values (5, 'Fruit', 'Pomme', 'Golden', 8, NULL, NULL);
    insert into TUTOS_PROC_STOCKEE (ID,FAMILLE, TYPE, SOUS_TYPE, QUANTITE, P_ST_T, P_T_F) 
    values (6, 'Fruit', 'Pomme', 'Rouge', 12, NULL, NULL);

    Merci de m'aider

    PoichOU

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    Pourquoi vouloir le faire avec une procédure stockée alors qu'une vue est largement suffisante ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

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

Discussions similaires

  1. [MySQL] Mettre à jour plusieurs ligne de la bdd en même temps
    Par subran dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 09/06/2014, 12h27
  2. [procédure stockée] Requête renvoyant plusieurs lignes avec MySQL
    Par ourseblanche dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 16/01/2010, 17h13
  3. [procédure stockée] Requête renvoyant plusieurs lignes
    Par ourseblanche dans le forum MySQL
    Réponses: 4
    Dernier message: 21/07/2009, 10h50
  4. Mettre à jour plusieurs lignes d'une table
    Par beegees dans le forum Langage
    Réponses: 5
    Dernier message: 15/10/2008, 18h09
  5. Procédure mettre à jour plusieurs lignes
    Par JEFF56 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 29/05/2006, 10h53

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