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

Requêtes MySQL Discussion :

Simplifier une longue requête répétitive


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 121
    Points : 53
    Points
    53
    Par défaut Simplifier une longue requête répétitive
    Bonjour à toutes et à tous,

    Je me présente vite fait, je suis l’emmerdeur de la journée avec la question de merde, celui qui essaie de tout faire lui-même mais qui après des semaines passées à tester des tas de solutions en regardant, lisant beaucoup de messages, de conseils, n’y arrive toujours pas.
    Parce qu’il ne connait que quelques balbutiements.
    Inutile de vous préciser qu’il n’applique pas les règles et les consignes (c’était déjà le cas au collège. Il n’est pas allé plus loin. Et à cinquante balais, difficile de tout faire rentrer dans sa caboche.)
    Ah, des idées il en voit mais après des tas d’essais infructueux il se décide enfin à poser « LA » question.
    Le plus terrible dans tout ça c’est que j’aime ce que je suis en train d’essayer de faire pour simplifier les taches de ma Femme et que je sais qu’il y a une solution.
    Je ne vous demande pas la réponse clefs en main, même si à la fin vous en aurez marre et vous vous direz qu’il vaut mieux lui donner le truc, mais je voudrais comprendre, savoir à coté de quoi je suis passé durant des semaines.

    Elle (ma Femme), s’occupe de plusieurs petits dépôts dans cinq villes différentes qui stockent des produits que les employées prennent quand ils en ont besoin. Ils notent alors sur une feuille ce qu’ils ont pris. Et quand il n’y en a plus, ma Femme remet du produit.
    Extrêmement simple. Je lui ai fait un petit truc dans « Calc », mais je voudrais aller plus loin.

    J’utilise donc « PHPMyAdmin 4.7.3 ».
    J’ai créé (depuis tous les bons tuyaux et les exemples que j’ai trouvé sur le forum) deux tables : une « produit » et une « mouvement » dont je vous joins un échantillon.

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    --
    -- Structure de la table `produit`
    --
     
    CREATE TABLE `produit` (
      `produit_id` int(11) NOT NULL,
      `code_produit` varchar(17) NOT NULL,
      `nom_produit` text NOT NULL,
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    --
    -- Index pour la table `produit`
    --
    ALTER TABLE `produit`
      ADD PRIMARY KEY (`produit_id`);
    --
    -- AUTO_INCREMENT pour la table `produit`
    --
    ALTER TABLE `produit`
      MODIFY `produit_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=126;COMMIT;
     
     
     
    --
    -- Structure de la table `mouvement`
    --
     
    CREATE TABLE `mouvement` (
      `mouvement_id` int(11) NOT NULL,
      `mouvement_date` date NOT NULL,
      `mouvement` varchar(20) NOT NULL,
      `mouvement_type` varchar(100) NOT NULL,
      `produit_id` int(11) NOT NULL,
      `quantite` int(11) NOT NULL,
      `depot` varchar(3) NOT NULL,
      ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    --
    -- Index pour la table `mouvement`
    --
    ALTER TABLE `mouvement`
      ADD PRIMARY KEY (`mouvement_id`);
    --
    -- AUTO_INCREMENT pour les tables déchargées
    --
    --
    -- AUTO_INCREMENT pour la table `mouvement`
    --
    ALTER TABLE `mouvement`
      MODIFY `mouvement_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=178;COMMIT;
    « mouvement » est soit « entree » soit « sortie »
    « mouvement_type » est soit « livraison » soit « utilisation » soit « manquant »
    « depot » sont « AU1 », « LO2 », « SP3 », «SP4 », « MR5 », « AN6 »

    Les quantités sont toujours saisies en positif, j’effectue une soustraction sur les mouvements.

    Toutes les saisies se font depuis PHPMyAdmin, pour rester simple.

    Et la requête également.

    J’en viens à ce que je voudrais arriver à lui faire. Un joli tableau avec des colonnes

    Comme celui-ci :

    Nom : Tableau Requête SQL.PNG
Affichages : 237
Taille : 10,8 Ko

    A l’aide d’une requête.

    Alors j’ai rédigé celle-là :
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    SELECT 
    /*COLONNE 1 : On sélectionne tous les produits qui sont enregistrés dans la BDD*/
    produit_id,
    /*COLONNE 2 : On soustrait les entrees aux sorties pour obtenir les produits disponibles*/
    (SELECT COALESCE (SUM(quantite),0)
    FROM mouvement
    WHERE produit.produit_id=mouvement.produit_id
    AND mouvement.mouvement='entree'
    AND depot='AU1'
    GROUP BY mouvement.produit_id)
    -
    (SELECT COALESCE (SUM(quantite),0)
    FROM mouvement
    WHERE produit.produit_id=mouvement.produit_id
    AND mouvement.mouvement='sortie'
    AND depot='AU1'
    )
    AS Dispo
    ,
    /*COLONNE 2 : Indique le nombre de produit qui ont été livrés*/
    (SELECT COALESCE (SUM(quantite),0)
    FROM mouvement
    WHERE produit.produit_id=mouvement.produit_id
    AND mouvement.mouvement_type='livraison'
    AND depot='AU1'
    GROUP BY mouvement.produit_id
    )
    AS Livré
    ,
    /*COLONNE 2 : Indique le nombre de produit qui ont été utilisés*/
    (SELECT COALESCE (SUM(quantite),0)
    FROM mouvement
    WHERE produit.produit_id=mouvement.produit_id
    AND mouvement.mouvement_type='utilisation'
    AND depot='AU1'
    )
    AS Utilisé
     
    FROM produit
     
    GROUP BY produit_id
     
    ORDER BY produit_id
    Cette requête affiche un tableau avec la liste des produits et des quantités dans chaque colonne, uniquement pour le dépôt « AU1 ».

    Ce que je me dis, c’est que si je duplique le « SELECT » pour chaque dépôt, ce que je n’ai pas testé d’ailleurs, je vais créer une requête à rallonge, et qu’il y a donc forcément une autre solution.

    Et c’est là que je compte sur votre génie, pour m’oriente
    r vers la meilleure façon d’écrire cette requête pour ne pas en faire une usine à gaz. Ceci dit, c’est peut-être déjà le cas, mais j’ai fait ce qui était à ma portée.

    Merci à toutes et à tous de votre lecture, de vos lumières, orientations et indulgences.

    Gregus

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 197
    Points : 12 772
    Points
    12 772
    Par défaut
    Bonjour,
    Tu peux simplifier la requête de cette façon:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select t1.id,sum(case when t2.colx = 1 then t2.coly else 0 end),sum(case when t2.colx = 2 then t2.colz else 0 end)
    from UneTable as t1
    left outer join Autretable as t2 on T1.id = t2.id1
    group by t1.id

    Ainsi les divers choix se retrouve dans le Select, et il n'y a qu'une seuls jointure sans sous-requête.

    Tatayo.

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 121
    Points : 53
    Points
    53
    Par défaut
    Bonjour Tatayo,

    D'abord merci pour ta réponse, merci pour ton idée de code que j'ai décortiqué, essayé de comprendre et adapté.

    C'est vrai que l'écriture est nettement réduite.

    J'ai fait plusieurs essais juste sur deux dépôts pour voir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select produit.produit_id, sum(case when mouvement.depot = 'AU1' then mouvement.quantite else 0 end), sum(case when mouvement.depot = 'LO2' then mouvement.quantite else 0 end)
    from produit as produit
    left outer join mouvement as mouvement on produit.produit_id = mouvement.produit_id
    group by produit.produit_id
    Cela me donne une quantité mais je sais pas laquelle encore. Je cherche.
    Et je reviens vous donner des nouvelles, mais je pense que maintenant ce sera demain.

    Je vous tiens au courant

    Merci Tatayo pour l'avancé

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 121
    Points : 53
    Points
    53
    Par défaut
    Bonjour Tatayo,
    Bonjour à toutes et tous,

    Tatayo,

    Après une nuit de sommeil, j'ai repris la solution à laquelle j'étais arrivé après ta solution. Il y avait dans les résultats des erreurs dans les quantités. Ce qui m'a montré que ta solution était une bonne solution, mais qu'il fallait que je travaille encore. Tu ne m'avais pas selon moi donné le code clefs en main. En même temps c'est ce que je voulais, et en même temps comme je n'y connais pas grand chose il a donc fallu que je creuse un peu plus.
    J'ai lu quelques explications sur "case when..." pour comprendre les services qu'il pouvait me rendre et les résultats que je pouvais obtenir.

    Dans le code testé hier soir j'avais remarqué que je ne traitais pas les "mouvement" ou les "mouvement_type". J'ai découvert qu'en mettant un "case when..." après le premier "then" (je crois qu'on appelle ça une condition) on pouvait mettre une autre condition.
    Effectivement, cela m'a permis de créer une colonne pour les "entrée" et une pour les "sortie" en écrivant le code ci-dessous.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select produit.produit_id,
    sum(case when mouvement.depot = 'AU1' then case when mouvement.mouvement = 'utilisation' then mouvement.quantite else 0 end else 0 end) AS AU1_U,
    sum(case when mouvement.depot = 'AU1' then case when mouvement.mouvement='livraison' then mouvement.quantite else 0 end else 0 end) as AU1_L,
     
    from produit as produit
    left outer join mouvement as mouvement on produit.produit_id = mouvement.produit_id
    group by produit.produit_id
    Je ne sais pas si c'est la bonne façon de faire, mais ça marche comme ça. Par la suite j'ai remplacé le " else 0 " par " else "" " pour une meilleur lisibilité.

    Il me manquait à soustraire les deux pour connaître le nombre restant. Je peux vous dire que j'ai cherché et que je tourné les différents éléments sur eux-même. Je ne suis pas une génie. j'ai d'abord écrit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sum(case when mouvement.depot = 'AU1' then case when mouvement.mouvement = 'livraison'-then case when mouvement.mouvement='utilisation' then mouvement.quantite else 0 end else 0 end) AS AU1_R
    C'est simple, facile, les "livraison" moins les "utilisation". Je suis pas certain qu'un enfant de 4 ans aurait fait ça.

    Résultat 0. Vérification faite sur les papiers, il en reste 1. Donc ça ne fonctionne pas. Et mer... Trop facile pourtant.

    Je continue de réfléchir, lire et relire le code et d'un coup je constate que c'est "mouvement.quantite" qui détient LA quantité. Je vous ai prévenu, je ne suis pas un génie.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sum(case when mouvement.depot = 'AU1' then case when mouvement.mouvement = 'livraison' then mouvement.quantite-then case when mouvement.mouvement='utilisation' else 0 end else 0 end) AS AU1_R
    Eh bien NON.

    J'en ai fait plein des comme ça sans résultat. J'ai continué de chercher jusqu'à trouver une soustraction similaire à celle que j'utilise maintenant.

    Du coup, j'arrive à ce bout de code peut-être un peu long mais ça fonctionne, j'obtiens ce que je souhaitais.

    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
     
    select produit.produit_id,
    sum(case when mouvement.depot = 'AU1' then case when mouvement.mouvement='livraison' then mouvement.quantite else 0 end else 0 end)-sum(case when mouvement.depot = 'AU1' then case when mouvement.mouvement='utilisation' then mouvement.quantite else 0 end else 0 end) as AU1_R,
    sum(case when mouvement.depot = 'AU1' then case when mouvement.mouvement='livraison' then mouvement.quantite else 0 end else 0 end) as AU1_L,
    sum(case when mouvement.depot = 'AU1' then case when mouvement.mouvement='utilisation' then mouvement.quantite else 0 end else 0 end) as AU1_U,
     
    sum(case when mouvement.depot = 'LO2' then case when mouvement.mouvement='livraison' then mouvement.quantite else 0 end else 0 end)-sum(case when mouvement.depot = 'LO2' then case when mouvement.mouvement='utilisation' then mouvement.quantite else 0 end else 0 end) as LO2_R,
    sum(case when mouvement.depot = 'LO2' then case when mouvement.mouvement='livraison' then mouvement.quantite else 0 end else 0 end) as LO2_L,
    sum(case when mouvement.depot = 'LO2' then case when mouvement.mouvement='utilisation' then mouvement.quantite else 0 end else 0 end) as LO2_U,
     
    sum(case when mouvement.depot = 'SP3' then case when mouvement.mouvement='livraison' then mouvement.quantite else 0 end else 0 end)-sum(case when mouvement.depot = 'SP3' then case when mouvement.mouvement='utilisation' then mouvement.quantite else 0 end else 0 end) as SP3_R,
    sum(case when mouvement.depot = 'SP3' then case when mouvement.mouvement='livraison' then mouvement.quantite else 0 end else 0 end) as SP3_L,
    sum(case when mouvement.depot = 'SP3' then case when mouvement.mouvement='utilisation' then mouvement.quantite else 0 end else 0 end) as SP3_U,
     
    sum(case when mouvement.depot = 'SP4' then case when mouvement.mouvement='livraison' then mouvement.quantite else 0 end else 0 end)-sum(case when mouvement.depot = 'SPM' then case when mouvement.mouvement='utilisation' then mouvement.quantite else 0 end else 0 end) as SP4_R,
    sum(case when mouvement.depot = 'SP4' then case when mouvement.mouvement='livraison' then mouvement.quantite else 0 end else 0 end) as SP4_L,
    sum(case when mouvement.depot = 'SP4' then case when mouvement.mouvement='utilisation' then mouvement.quantite else 0 end else 0 end) as SP4_U,
     
    sum(case when mouvement.depot = 'MR5' then case when mouvement.mouvement='entree' then mouvement.quantite else 0 end else 0 end)-sum(case when mouvement.depot = 'SPD' then case when mouvement.mouvement='utilisation' then mouvement.quantite else 0 end else 0 end) as MR5_R,
    sum(case when mouvement.depot = 'MR5' then case when mouvement.mouvement='livraison' then mouvement.quantite else 0 end else 0 end) as MR5_L,
    sum(case when mouvement.depot = 'MR5' then case when mouvement.mouvement='utilisation' then mouvement.quantite else 0 end else 0 end) as MR5_U,
     
    sum(case when mouvement.depot = 'AN6' then case when mouvement.mouvement='livraison' then mouvement.quantite else 0 end else 0 end)-sum(case when mouvement.depot = 'M3R' then case when mouvement.mouvement='utilisation' then mouvement.quantite else 0 end else 0 end) as AN6_R,
    sum(case when mouvement.depot = 'AN6' then case when mouvement.mouvement='livraison' then mouvement.quantite else 0 end else 0 end) as AN6_L,
    sum(case when mouvement.depot = 'AN6' then case when mouvement.mouvement='utilisation' then mouvement.quantite else 0 end else 0 end) as AN6_U
     
    from produit as produit
    left outer join mouvement as mouvement on produit.produit_id = mouvement.produit_id
    group by produit.produit_id
    Je mettrai en "résolu" dans quelques jours parce que je me pose encore des questions:

    Est-ce qu'il est possible de réduire encore ce code? Je ne suis pas certain étant donné que les alias correspondent à chacune des colonnes.

    Et j'ai plein de 0 que je pensais pouvoir remplacer par des ensemble vide en remplaçant les 0 des "else" par des quotes ou des double quotes.

    Bon si quelqu'un a des petites idées supplémentaires ou complémentaires je serai preneur.

    J'espère que je vous ai plus fait marrer qu'emmerdés.

    Et pour conclure un GRAND MERCI à Tatayo qui m'a donné ce qu'il fallait.

    Bien à vous

    Gregus

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 197
    Points : 12 772
    Points
    12 772
    Par défaut
    Bonjour,
    Tu peux encore simplifier (un peu) la requête. En effet tu peux "grouper" des conditions dans un WHEN:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select sum(case when colx=1 and colY = 2 then colz else 0 end)
    from...
    Ce qui nous permet de remplacer cette expression:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select produit.produit_id,
    sum(case when mouvement.depot = 'AU1' then case when mouvement.mouvement='livraison' then mouvement.quantite else 0 end else 0 end)
    par celle-ci:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select produit.produit_id,
    sum(case when mouvement.depot = 'AU1' and mouvement.mouvement='livraison' then mouvement.quantite else 0 end)
    Ce n'est pas grand chose, mais je trouve que c'est plus lisible .

    Enfin je vois que les même expression sont toutes présentes 2 fois, par exemple AU1_R est en fait la différence entre AU1_L et AU1_U.
    Il y a peut-être un moyen de simplifier, par exemple avec une CTE, à voir.

    Tatayo.

  6. #6
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 377
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 377
    Points : 19 049
    Points
    19 049
    Par défaut
    Salut à tous.

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE IF NOT EXISTS `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `produit`
    --------------
     
    --------------
    create table `produit`
    ( `id`    integer unsigned  not null auto_increment primary key,
      `code`  varchar(255)      not null,
      `nom`   text              not null
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `produit` (`code`,`nom`) VALUES
      ('code 1', 'produit 1'),
      ('code 2', 'produit 2'),
      ('code 3', 'produit 3'),
      ('code 4', 'produit 4'),
      ('code 5', 'produit 5'),
      ('code 6', 'produit 6')
    --------------
     
    --------------
    select * from `produit`
    --------------
     
    +----+--------+-----------+
    | id | code   | nom       |
    +----+--------+-----------+
    |  1 | code 1 | produit 1 |
    |  2 | code 2 | produit 2 |
    |  3 | code 3 | produit 3 |
    |  4 | code 4 | produit 4 |
    |  5 | code 5 | produit 5 |
    |  6 | code 6 | produit 6 |
    +----+--------+-----------+
    --------------
    DROP TABLE IF EXISTS `mouvement`
    --------------
     
    --------------
    create table `mouvement`
    (  `id`       integer unsigned  not null auto_increment primary key,
      `date`      date              not null,
      `sens`      char(01)          not null,
      `type`      char(01)          not null,
      `produit`   integer unsigned  not null,
      `quantite`  integer unsigned  not null,
      `depot`     char(03)          not null,
      CONSTRAINT `FK_01` FOREIGN KEY (`produit`) REFERENCES `produit` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `mouvement` (`date`,`sens`,`type`,`produit`,`quantite`,`depot`) VALUES
      ('2019-05-01','E','L',1,25,'AU1'),('2019-05-02','S','U',1,02,'AU1'),('2019-05-03','S','D',1,02,'AU1'),
      ('2019-05-04','E','L',1,25,'AU1'),('2019-05-05','S','U',1,02,'AU1'),('2019-05-06','S','D',1,02,'AU1'),
      ('2019-05-01','E','L',2,44,'LO2'),('2019-05-02','S','U',2,03,'LO2'),('2019-05-03','S','D',2,03,'LO2'),
      ('2019-05-04','E','L',2,44,'LO2'),('2019-05-05','S','U',2,03,'LO2'),('2019-05-06','S','D',2,03,'LO2'),
      ('2019-05-04','E','L',3,75,'SP3'),('2019-05-05','S','U',3,02,'SP3'),('2019-05-06','S','D',3,02,'SP3'),
      ('2019-05-07','E','L',3,75,'SP3'),('2019-05-08','S','U',3,02,'SP3'),('2019-05-09','S','D',3,02,'SP3'),
      ('2019-05-04','E','L',4,26,'SP4'),('2019-05-04','S','U',4,01,'SP4'),('2019-05-05','S','D',4,01,'SP4'),
      ('2019-05-05','E','L',4,26,'SP4'),('2019-05-06','S','U',4,01,'SP4'),('2019-05-06','S','D',4,01,'SP4'),
      ('2019-05-05','E','L',5,26,'MR5'),('2019-05-05','S','U',5,01,'MR5'),('2019-05-05','S','D',5,01,'MR5'),
      ('2019-05-07','E','L',5,26,'MR5'),('2019-05-07','S','U',5,01,'MR5'),('2019-05-07','S','D',5,01,'MR5'),
      ('2019-05-08','E','L',6,26,'AN6'),('2019-05-08','S','U',6,01,'AN6'),('2019-05-08','S','D',6,01,'AN6'),
      ('2019-05-08','E','L',6,26,'AN6'),('2019-05-08','S','U',6,01,'AN6'),('2019-05-08','S','D',6,01,'AN6')
    --------------
     
    --------------
    select * from `mouvement`
    --------------
     
    +----+------------+------+------+---------+----------+-------+
    | id | date       | sens | type | produit | quantite | depot |
    +----+------------+------+------+---------+----------+-------+
    |  1 | 2019-05-01 | E    | L    |       1 |       25 | AU1   |
    |  2 | 2019-05-02 | S    | U    |       1 |        2 | AU1   |
    |  3 | 2019-05-03 | S    | D    |       1 |        2 | AU1   |
    |  4 | 2019-05-04 | E    | L    |       1 |       25 | AU1   |
    |  5 | 2019-05-05 | S    | U    |       1 |        2 | AU1   |
    |  6 | 2019-05-06 | S    | D    |       1 |        2 | AU1   |
    |  7 | 2019-05-01 | E    | L    |       2 |       44 | LO2   |
    |  8 | 2019-05-02 | S    | U    |       2 |        3 | LO2   |
    |  9 | 2019-05-03 | S    | D    |       2 |        3 | LO2   |
    | 10 | 2019-05-04 | E    | L    |       2 |       44 | LO2   |
    | 11 | 2019-05-05 | S    | U    |       2 |        3 | LO2   |
    | 12 | 2019-05-06 | S    | D    |       2 |        3 | LO2   |
    | 13 | 2019-05-04 | E    | L    |       3 |       75 | SP3   |
    | 14 | 2019-05-05 | S    | U    |       3 |        2 | SP3   |
    | 15 | 2019-05-06 | S    | D    |       3 |        2 | SP3   |
    | 16 | 2019-05-07 | E    | L    |       3 |       75 | SP3   |
    | 17 | 2019-05-08 | S    | U    |       3 |        2 | SP3   |
    | 18 | 2019-05-09 | S    | D    |       3 |        2 | SP3   |
    | 19 | 2019-05-04 | E    | L    |       4 |       26 | SP4   |
    | 20 | 2019-05-04 | S    | U    |       4 |        1 | SP4   |
    | 21 | 2019-05-05 | S    | D    |       4 |        1 | SP4   |
    | 22 | 2019-05-05 | E    | L    |       4 |       26 | SP4   |
    | 23 | 2019-05-06 | S    | U    |       4 |        1 | SP4   |
    | 24 | 2019-05-06 | S    | D    |       4 |        1 | SP4   |
    | 25 | 2019-05-05 | E    | L    |       5 |       26 | MR5   |
    | 26 | 2019-05-05 | S    | U    |       5 |        1 | MR5   |
    | 27 | 2019-05-05 | S    | D    |       5 |        1 | MR5   |
    | 28 | 2019-05-07 | E    | L    |       5 |       26 | MR5   |
    | 29 | 2019-05-07 | S    | U    |       5 |        1 | MR5   |
    | 30 | 2019-05-07 | S    | D    |       5 |        1 | MR5   |
    | 31 | 2019-05-08 | E    | L    |       6 |       26 | AN6   |
    | 32 | 2019-05-08 | S    | U    |       6 |        1 | AN6   |
    | 33 | 2019-05-08 | S    | D    |       6 |        1 | AN6   |
    | 34 | 2019-05-08 | E    | L    |       6 |       26 | AN6   |
    | 35 | 2019-05-08 | S    | U    |       6 |        1 | AN6   |
    | 36 | 2019-05-08 | S    | D    |       6 |        1 | AN6   |
    +----+------------+------+------+---------+----------+-------+
    --------------
    select      t2.id,
                t2.code,
                t2.nom,
                t1.id,
                t1.date,
                t1.sens,
                t1.type,
                t1.produit,
                t1.quantite,
                t1.depot
     
          from  `mouvement` as t1
     
    inner join  `produit`   as t2
            on  t2.id = t1.produit
     
      order by  t2.id
    --------------
     
    +----+--------+-----------+----+------------+------+------+---------+----------+-------+
    | id | code   | nom       | id | date       | sens | type | produit | quantite | depot |
    +----+--------+-----------+----+------------+------+------+---------+----------+-------+
    |  1 | code 1 | produit 1 |  1 | 2019-05-01 | E    | L    |       1 |       25 | AU1   |
    |  1 | code 1 | produit 1 |  2 | 2019-05-02 | S    | U    |       1 |        2 | AU1   |
    |  1 | code 1 | produit 1 |  3 | 2019-05-03 | S    | D    |       1 |        2 | AU1   |
    |  1 | code 1 | produit 1 |  4 | 2019-05-04 | E    | L    |       1 |       25 | AU1   |
    |  1 | code 1 | produit 1 |  5 | 2019-05-05 | S    | U    |       1 |        2 | AU1   |
    |  1 | code 1 | produit 1 |  6 | 2019-05-06 | S    | D    |       1 |        2 | AU1   |
    |  2 | code 2 | produit 2 |  7 | 2019-05-01 | E    | L    |       2 |       44 | LO2   |
    |  2 | code 2 | produit 2 |  8 | 2019-05-02 | S    | U    |       2 |        3 | LO2   |
    |  2 | code 2 | produit 2 |  9 | 2019-05-03 | S    | D    |       2 |        3 | LO2   |
    |  2 | code 2 | produit 2 | 10 | 2019-05-04 | E    | L    |       2 |       44 | LO2   |
    |  2 | code 2 | produit 2 | 11 | 2019-05-05 | S    | U    |       2 |        3 | LO2   |
    |  2 | code 2 | produit 2 | 12 | 2019-05-06 | S    | D    |       2 |        3 | LO2   |
    |  3 | code 3 | produit 3 | 13 | 2019-05-04 | E    | L    |       3 |       75 | SP3   |
    |  3 | code 3 | produit 3 | 14 | 2019-05-05 | S    | U    |       3 |        2 | SP3   |
    |  3 | code 3 | produit 3 | 15 | 2019-05-06 | S    | D    |       3 |        2 | SP3   |
    |  3 | code 3 | produit 3 | 16 | 2019-05-07 | E    | L    |       3 |       75 | SP3   |
    |  3 | code 3 | produit 3 | 17 | 2019-05-08 | S    | U    |       3 |        2 | SP3   |
    |  3 | code 3 | produit 3 | 18 | 2019-05-09 | S    | D    |       3 |        2 | SP3   |
    |  4 | code 4 | produit 4 | 19 | 2019-05-04 | E    | L    |       4 |       26 | SP4   |
    |  4 | code 4 | produit 4 | 20 | 2019-05-04 | S    | U    |       4 |        1 | SP4   |
    |  4 | code 4 | produit 4 | 21 | 2019-05-05 | S    | D    |       4 |        1 | SP4   |
    |  4 | code 4 | produit 4 | 22 | 2019-05-05 | E    | L    |       4 |       26 | SP4   |
    |  4 | code 4 | produit 4 | 23 | 2019-05-06 | S    | U    |       4 |        1 | SP4   |
    |  4 | code 4 | produit 4 | 24 | 2019-05-06 | S    | D    |       4 |        1 | SP4   |
    |  5 | code 5 | produit 5 | 25 | 2019-05-05 | E    | L    |       5 |       26 | MR5   |
    |  5 | code 5 | produit 5 | 26 | 2019-05-05 | S    | U    |       5 |        1 | MR5   |
    |  5 | code 5 | produit 5 | 27 | 2019-05-05 | S    | D    |       5 |        1 | MR5   |
    |  5 | code 5 | produit 5 | 28 | 2019-05-07 | E    | L    |       5 |       26 | MR5   |
    |  5 | code 5 | produit 5 | 29 | 2019-05-07 | S    | U    |       5 |        1 | MR5   |
    |  5 | code 5 | produit 5 | 30 | 2019-05-07 | S    | D    |       5 |        1 | MR5   |
    |  6 | code 6 | produit 6 | 31 | 2019-05-08 | E    | L    |       6 |       26 | AN6   |
    |  6 | code 6 | produit 6 | 32 | 2019-05-08 | S    | U    |       6 |        1 | AN6   |
    |  6 | code 6 | produit 6 | 33 | 2019-05-08 | S    | D    |       6 |        1 | AN6   |
    |  6 | code 6 | produit 6 | 34 | 2019-05-08 | E    | L    |       6 |       26 | AN6   |
    |  6 | code 6 | produit 6 | 35 | 2019-05-08 | S    | U    |       6 |        1 | AN6   |
    |  6 | code 6 | produit 6 | 36 | 2019-05-08 | S    | D    |       6 |        1 | AN6   |
    +----+--------+-----------+----+------------+------+------+---------+----------+-------+
    --------------
    drop view if exists `vue_1`
    --------------
     
    --------------
    create view `vue_1` as
          select  t2.nom,
                  t1.depot,
                  t1.type,
                  sum(case t1.sens when 'E' then +t1.quantite
                                   when 'S' then -t1.quantite
                                            else 0 end) as quantite
            from  `mouvement` as t1
     
      inner join  `produit`   as t2
              on  t2.id = t1.produit
     
        group by  t2.nom, t1.depot, t1.type
    --------------
     
    --------------
    select  *
      from  `vue_1`
    --------------
     
    +-----------+-------+------+----------+
    | nom       | depot | type | quantite |
    +-----------+-------+------+----------+
    | produit 1 | AU1   | L    |       50 |
    | produit 1 | AU1   | U    |       -4 |
    | produit 1 | AU1   | D    |       -4 |
    | produit 2 | LO2   | L    |       88 |
    | produit 2 | LO2   | U    |       -6 |
    | produit 2 | LO2   | D    |       -6 |
    | produit 3 | SP3   | L    |      150 |
    | produit 3 | SP3   | U    |       -4 |
    | produit 3 | SP3   | D    |       -4 |
    | produit 4 | SP4   | L    |       52 |
    | produit 4 | SP4   | U    |       -2 |
    | produit 4 | SP4   | D    |       -2 |
    | produit 5 | MR5   | L    |       52 |
    | produit 5 | MR5   | U    |       -2 |
    | produit 5 | MR5   | D    |       -2 |
    | produit 6 | AN6   | L    |       52 |
    | produit 6 | AN6   | U    |       -2 |
    | produit 6 | AN6   | D    |       -2 |
    +-----------+-------+------+----------+
    --------------
    drop view if exists `vue_2`
    --------------
     
    --------------
    create view `vue_2` as
     
      select  nom,  case when depot = 'AU1' and type = 'D' then sum(quantite) else 0 end as DAU1,
                    case when depot = 'AU1' and type = 'L' then sum(quantite) else 0 end as LAU1,
                    case when depot = 'AU1' and type = 'U' then sum(quantite) else 0 end as UAU1,
                    case when depot = 'LO2' and type = 'D' then sum(quantite) else 0 end as DLO2,
                    case when depot = 'LO2' and type = 'L' then sum(quantite) else 0 end as LLO2,
                    case when depot = 'LO2' and type = 'U' then sum(quantite) else 0 end as ULO2,
                    case when depot = 'SP3' and type = 'D' then sum(quantite) else 0 end as DSP3,
                    case when depot = 'SP3' and type = 'L' then sum(quantite) else 0 end as LSP3,
                    case when depot = 'SP3' and type = 'U' then sum(quantite) else 0 end as USP3,
                    case when depot = 'SP4' and type = 'D' then sum(quantite) else 0 end as DSP4,
                    case when depot = 'SP4' and type = 'L' then sum(quantite) else 0 end as LSP4,
                    case when depot = 'SP4' and type = 'U' then sum(quantite) else 0 end as USP4,
                    case when depot = 'MR5' and type = 'D' then sum(quantite) else 0 end as DMR5,
                    case when depot = 'MR5' and type = 'L' then sum(quantite) else 0 end as LMR5,
                    case when depot = 'MR5' and type = 'U' then sum(quantite) else 0 end as UMR5,
                    case when depot = 'AN6' and type = 'D' then sum(quantite) else 0 end as DAN6,
                    case when depot = 'AN6' and type = 'L' then sum(quantite) else 0 end as LAN6,
                    case when depot = 'AN6' and type = 'U' then sum(quantite) else 0 end as UAN6
              from  `vue_1`
          group by  nom, depot, type
    --------------
     
    --------------
    select  *  from  `vue_2`
    --------------
     
    +-----------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
    | nom       | DAU1 | LAU1 | UAU1 | DLO2 | LLO2 | ULO2 | DSP3 | LSP3 | USP3 | DSP4 | LSP4 | USP4 | DMR5 | LMR5 | UMR5 | DAN6 | LAN6 | UAN6 |
    +-----------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
    | produit 1 |    0 |   50 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |
    | produit 1 |    0 |    0 |   -4 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |
    | produit 1 |   -4 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |
    | produit 2 |    0 |    0 |    0 |    0 |   88 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |
    | produit 2 |    0 |    0 |    0 |    0 |    0 |   -6 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |
    | produit 2 |    0 |    0 |    0 |   -6 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |
    | produit 3 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |  150 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |
    | produit 3 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |   -4 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |
    | produit 3 |    0 |    0 |    0 |    0 |    0 |    0 |   -4 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |
    | produit 4 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |   52 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |
    | produit 4 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |   -2 |    0 |    0 |    0 |    0 |    0 |    0 |
    | produit 4 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |   -2 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |
    | produit 5 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |   52 |    0 |    0 |    0 |    0 |
    | produit 5 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |   -2 |    0 |    0 |    0 |
    | produit 5 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |   -2 |    0 |    0 |    0 |    0 |    0 |
    | produit 6 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |   52 |    0 |
    | produit 6 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |   -2 |
    | produit 6 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |   -2 |    0 |    0 |
    +-----------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
    --------------
    drop view if exists `vue_3`
    --------------
     
    --------------
    create view `vue_3` as
     
      select  nom,  sum(DAU1) as DAU1, sum(LAU1) as LAU1, sum(UAU1) as UAU1,
                    sum(DLO2) as DLO2, sum(LLO2) as LLO2, sum(ULO2) as ULO2,
                    sum(DSP3) as DSP3, sum(LSP3) as LSP3, sum(USP3) as USP3,
                    sum(DSP4) as DSP4, sum(LSP4) as LSP4, sum(USP4) as USP4,
                    sum(DMR5) as DMR5, sum(LMR5) as LMR5, sum(UMR5) as UMR5,
                    sum(DAN6) as DAN6, sum(LAN6) as LAN6, sum(UAN6) as UAN6
        from  `vue_2`
    group by  nom
    --------------
     
    --------------
    select  *  from  `vue_3`
    --------------
     
    +-----------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
    | nom       | DAU1 | LAU1 | UAU1 | DLO2 | LLO2 | ULO2 | DSP3 | LSP3 | USP3 | DSP4 | LSP4 | USP4 | DMR5 | LMR5 | UMR5 | DAN6 | LAN6 | UAN6 |
    +-----------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
    | produit 1 |   -4 |   50 |   -4 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |
    | produit 2 |    0 |    0 |    0 |   -6 |   88 |   -6 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |
    | produit 3 |    0 |    0 |    0 |    0 |    0 |    0 |   -4 |  150 |   -4 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |
    | produit 4 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |   -2 |   52 |   -2 |    0 |    0 |    0 |    0 |    0 |    0 |
    | produit 5 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |   -2 |   52 |   -2 |    0 |    0 |    0 |
    | produit 6 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |   -2 |   52 |   -2 |
    +-----------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
    --------------
    COMMIT
    --------------
     
    Appuyez sur une touche pour continuer...
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 121
    Points : 53
    Points
    53
    Par défaut
    Bonjour Tatayo,

    Comment peut-tu faire pour répondre aussi vite?
    Il m'a fallu trois heures pour écrire mon précédent message.

    Je m'en doutais, j'ai un peu regardé mais pas vraiment creusé pour mettre un "and" dans le "when" et j'étais à l'autre solution que j'avais trouvé du premier coup.

    Effectivement c'est plus lisible et moi je trouve que c'est moins compliqué à lire et écrire.

    Je vais faire les modifications et des essais et reviendrai avec les résultats. Mais pas avant mercredi, parce que demain j'ai... pas piscine, ma femme veut pas.

    Effectivement, AU1_R est la différence entre AU1_L et AU1_U. Il aurait été plus simple de soustraire les résultats des lignes de la colonne AU1_L à celle de AU1_U. Mais dans le truc (pardon je sais pas si ça porte un nom) de PHPMyAdmin qui sert à faire des requêtes je pense pas qu'on puisse lui dire à la façon de "Calc" dans la cellule A1 "=B1-C1" et cela autant de fois qu'il y a de lignes et "B" contient toutes les données de AU1_L et "C" toutes celles de AU1_U.

    Par contre, tu éveilles ma curiosité, à moins que ce ne soit qu'un acronyme, qu'est-ce que c'est que CTE et vers quoi je dois chercher.

    Merci, à mercredi

    Gregus

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 129
    Points : 38 516
    Points
    38 516
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Gregus Voir le message
    Par contre, tu éveilles ma curiosité, à moins que ce ne soit qu'un acronyme, qu'est-ce que c'est que CTE et vers quoi je dois chercher.
    Une CTE (Common Table Expression ou Expression de Table Commune) est un moyen d'écrire une table dérivée en amont des requêtes, c'est plus facile à lire, ça permet d'en mutualiser l'utilisation et c'est également la seule façon d'écrire une requête récursive.
    A savoir : MySQL n'a adpoté les CTE que depuis la version 8, donc si vous avez une version antérieure, vous ne pouvez pas les utiliser

    La CTE se déclare avec WITH et un alias et s'utilise ensuite comme n'importe quelle table

    Exemple de requête utilisant deux CTE :
    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
    WITH Ma_CTE1 (col1, col2, col3) 
         AS (select ...
             from   ...
     
             inner join ...
                on
             where  ...
            )
       , MA_CTE2 (cola, colb)
         as (...)
    select T1,Col1
         , T2.Colb
         , T3.Colx
    from Ma_CTE1 T1
    inner join
         Ma_CTE2 T2
       on ...
    Left join
         TableX T3
       on ...
    Where ...

  9. #9
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 121
    Points : 53
    Points
    53
    Par défaut
    Bonjour Tatayo, Artemus24, Escartefigue,

    Tout d'abord, merci pour vos réponses et votre participation à mon sujet.

    Ce petit message pour vous dire que j'ai pris connaissance de vos réponses, suggestions, que j'ai parcourues rapidement.

    Il va me falloir deux jours pour traiter tout ça. Le temps de comprendre, analyser, et formuler une réponse. J'ai déjà commencé par prendre mon dictionnaire, parce que "récursive" je croyais avoir entendu ça en classe de 3ème, mais je dois confondre. En tous cas c'était pas dans le même domaine.

    Dans ce que j'ai lu du message de Artemus24, j'avais vu quelque chose sur "create view" mais n'avais pas approfondi ma lecture ne pensant pas que le système à requête de PHPMyAdmin pouvait le prendre en compte. Ceci dit je n'ai pas encore testé je vais le faire après.

    Je reviens vers vous et vous dis ce que j'ai fait, compris et ce à quoi je suis arrivé.

    A tout à l'heure. Ça m'aurait fait marrer de mettre une horloge qui fait défiler le temps à la suite, mais si c'est possible, je sais pas faire.

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/07/2011, 10h01
  2. [MySQL] Simplifier une requête SQL
    Par maestro982 dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 23/05/2010, 13h26
  3. [MySQL] Simplifier une requête
    Par novphp dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 31/01/2009, 12h18
  4. simplifier une requête avec des 'OR'
    Par Spaccio dans le forum Langage SQL
    Réponses: 3
    Dernier message: 12/05/2008, 10h06
  5. [SQL] Simplifier une requête SQL ?
    Par renaud26 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 29/04/2006, 13h50

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