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 :

Demande requêtes imbriquées [MySQL-5.0]


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Inscrit en
    Août 2003
    Messages
    228
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 228
    Points : 92
    Points
    92
    Par défaut Demande requêtes imbriquées
    Bonjour,

    Je suis un novice pour des requêtes imbriquées (sous-requete) avec 4 tables.
    Voici ma structure :

    Table1 (entête de commande) :
    CommandeN° , client, datecde ,

    ex:
    15.1256, 142 , 2015-02-16 ,
    15.1260, 300 , 2015-02-28 ,

    Table2 (détails commande):
    CommandeN°,ligneN° , qte, dateliv, article

    ex:
    15.1256 , 01 , 150 , 2015-03-20 , art0215
    15.1260 , 01 , 1250 , 2015-05-24 , art0230

    Table3 (entête de BL)
    BLn° ,CommandeN°, client, dateexp

    ex:
    16.1212 , 15.1256 , 142 , 2015-03-21
    16.1220 , 15.1256 , 142 , 2015-03-23

    Table4 (détails BL)
    BLN° , CommandeN°,ligneN° , qteliv, article

    ex:
    16.1212 ,15.256 , 01, 100 , art0215
    16.1220 ,15.256 , 02, 50 , art0215


    Voici le résultat que je souhaite:

    CommandeN° , client , datecde ,ligneN° , qtetotaleliv, dateliv, article , nombrebl , dernière date exp

    ex:

    15.1256, 142 , 2015-02-16 , 01 , 150 , 2015-03-20 , art0215 , 2 , 2015-03-23 ,
    15.1260, 300 , 2015-02-28 , 01 , 1250 , 2015-05-24 , art0230 , 0 , vide,


    En claire, je souhaite avoir la liste de mes commandes par article, le nombre de bl établie avec la qte total déjà livré de la commande avec la dernier date du dernier bl.



    J’espère que j'ai été claire dans mon explication.

    Merci de votre aide.
    Commandeur

  2. #2
    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 378
    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 378
    Points : 19 054
    Points
    19 054
    Par défaut
    Mes hommages mon commandeur.

    J'ai fait en sorte d'être conforme à ta demande.
    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
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `commande`
    --------------
     
    --------------
    CREATE TABLE `commande`
    (
      `id`      integer unsigned  NOT NULL AUTO_INCREMENT primary key,
      `numcmd`  char(07)          NOT NULL,
      `client`  integer unsigned  NOT NULL,
      `datcmd`  date              NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `commande` (`numcmd`, `client`, `datcmd`) VALUES
    ('15-1256', 142 , '2015-02-16'),
    ('15-1260', 300 , '2015-02-28')
    --------------
     
    --------------
    select * from commande
    --------------
     
    +----+---------+--------+------------+
    | id | numcmd  | client | datcmd     |
    +----+---------+--------+------------+
    |  1 | 15-1256 |    142 | 2015-02-16 |
    |  2 | 15-1260 |    300 | 2015-02-28 |
    +----+---------+--------+------------+
    --------------
    DROP TABLE IF EXISTS `detailcmd`
    --------------
     
    --------------
    CREATE TABLE `detailcmd`
    (
      `id`      integer unsigned  NOT NULL AUTO_INCREMENT primary key,
      `idcmd`   integer unsigned  NOT NULL,
      `ligne`   integer unsigned  NOT NULL,
      `qte`     integer unsigned  NOT NULL,
      `datliv`  date              NOT NULL,
      `article` char(07)          NOT NULL,
      CONSTRAINT `FK_01` FOREIGN KEY (`idcmd`) REFERENCES `commande` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `detailcmd` (`idcmd`,`ligne`,`qte`,`datliv`,`article`) VALUES
    (1, 1 ,  150 , '2015-03-20', 'art0215'),
    (2, 1 , 1250 , '2015-05-24', 'art0230')
    --------------
     
    --------------
    select * from detailcmd
    --------------
     
    +----+-------+-------+------+------------+---------+
    | id | idcmd | ligne | qte  | datliv     | article |
    +----+-------+-------+------+------------+---------+
    |  1 |     1 |     1 |  150 | 2015-03-20 | art0215 |
    |  2 |     2 |     1 | 1250 | 2015-05-24 | art0230 |
    +----+-------+-------+------+------------+---------+
    --------------
    DROP TABLE IF EXISTS `entetebl`
    --------------
     
    --------------
    CREATE TABLE `entetebl`
    (
      `id`      integer unsigned  NOT NULL AUTO_INCREMENT primary key,
      `numbl`   char(07)          NOT NULL,
      `idcmd`   integer unsigned  NOT NULL,
      `client`  integer unsigned  NOT NULL,
      `datexp`  date              NOT NULL,
      CONSTRAINT `FK_02` FOREIGN KEY (`idcmd`) REFERENCES `commande` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `entetebl` (`numbl`,`idcmd`,`client`,`datexp`) VALUES
    ('16-1212' , 1, 142 , '2015-03-21'),
    ('16-1220' , 1, 142 , '2015-03-23')
    --------------
     
    --------------
    select * from entetebl
    --------------
     
    +----+---------+-------+--------+------------+
    | id | numbl   | idcmd | client | datexp     |
    +----+---------+-------+--------+------------+
    |  1 | 16-1212 |     1 |    142 | 2015-03-21 |
    |  2 | 16-1220 |     1 |    142 | 2015-03-23 |
    +----+---------+-------+--------+------------+
    --------------
    DROP TABLE IF EXISTS `detailbl`
    --------------
     
    --------------
    CREATE TABLE `detailbl`
    (
      `id`      integer unsigned  NOT NULL AUTO_INCREMENT primary key,
      `idbl`    integer unsigned  NOT NULL,
      `ligne`   integer unsigned  NOT NULL,
      `qteliv`  integer unsigned  NOT NULL,
      `article` char(07)          NOT NULL,
      CONSTRAINT `FK_03` FOREIGN KEY (`idbl`) REFERENCES `entetebl` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `detailbl` (`idbl`,`ligne`,`qteliv`,`article`) VALUES
    (1, 1, 100, 'art0215'),
    (2, 2, 50,  'art0215')
    --------------
     
    --------------
    select * from detailbl
    --------------
     
    +----+------+-------+--------+---------+
    | id | idbl | ligne | qteliv | article |
    +----+------+-------+--------+---------+
    |  1 |    1 |     1 |    100 | art0215 |
    |  2 |    2 |     2 |     50 | art0215 |
    +----+------+-------+--------+---------+
    --------------
    select c.numcmd,
           c.client,
           c.datcmd,
           d.ligne,
           d.qte,
           d.datliv,
           d.article,
           max(e.datexp)          as Date_Max,
           count(distinct b.idbl) as Nbre_Bl,
           sum(b.qteliv)          as Qte_Tot_Liv
    from            commande  as c
     
    left outer join detailcmd as d
    on d.idcmd = c.id
     
    left outer join entetebl  as e
    on e.idcmd = c.id
     
    left outer join detailbl  as b
    on b.idbl = e.id
     
    group by c.numcmd,c.client,c.datcmd,d.ligne,d.qte,d.datliv,d.article
    --------------
     
    +---------+--------+------------+-------+------+------------+---------+------------+---------+-------------+
    | numcmd  | client | datcmd     | ligne | qte  | datliv     | article | Date_Max   | Nbre_Bl | Qte_Tot_Liv |
    +---------+--------+------------+-------+------+------------+---------+------------+---------+-------------+
    | 15-1256 |    142 | 2015-02-16 |     1 |  150 | 2015-03-20 | art0215 | 2015-03-23 |       2 |         150 |
    | 15-1260 |    300 | 2015-02-28 |     1 | 1250 | 2015-05-24 | art0230 | NULL       |       0 |        NULL |
    +---------+--------+------------+-------+------+------------+---------+------------+---------+-------------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
     
    Appuyez sur une touche pour continuer...
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  3. #3
    Membre régulier
    Inscrit en
    Août 2003
    Messages
    228
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 228
    Points : 92
    Points
    92
    Par défaut
    Bonjour,

    Merci de ta réponse, qui va m'aide dans ma recherche.

    Pourquoi a tu créer des tables? car les tables existe déjà dans mon système.
    Je ne souhaite pas créer de table, c'est pour ça que je recherche une requête avec des sous-requetes.

    Merci de ton aide.
    Commandeur

  4. #4
    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 378
    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 378
    Points : 19 054
    Points
    19 054
    Par défaut
    Salut commandeur.

    Citation Envoyé par Commandeur
    Pourquoi a tu créer des tables?
    Pour créer un jeu d'essai qui soit conforme à ce que tu attends.
    Maintenant que j'ai à ma disposition ce jeu d'essai, je peux faire tous les tests que tu désires.
    Il est plus facile de travailler sur quelque chose de concret que de te donner un semblant de solution qui sera bourré d'erreur.

    J'ai introduit dans les tables les clefs étrangères, et j'ai supprimé des colonnes qui sont redondantes.
    Jettes un coup d’œil aux tables pour voir comment j'ai procédé.
    Si tu as un jeu d'essai plus complet, il sera bien de le tester avec cette méthode.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  5. #5
    Membre régulier
    Inscrit en
    Août 2003
    Messages
    228
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 228
    Points : 92
    Points
    92
    Par défaut
    Merci, je vais essayer demain avec ma base donné.

    Je te remercie de ton exemple
    Commandeur

  6. #6
    Membre régulier
    Inscrit en
    Août 2003
    Messages
    228
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 228
    Points : 92
    Points
    92
    Par défaut
    Bonjour,

    J'ai essayer de faire, j'ai quelque soucis dans ma requette :

    Mes table:
    gfcoe
    Nom : cde 1entete.PNG
Affichages : 82
Taille : 1,3 Ko

    gfcol
    Nom : cde 1.PNG
Affichages : 74
Taille : 8,3 Ko

    gfble
    Nom : entete bl.PNG
Affichages : 73
Taille : 1,9 Ko

    gfbll
    Nom : entete detail.PNG
Affichages : 72
Taille : 2,8 Ko


    Voici ma requette :

    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
     
     
    select  c.no_ar ,c.client ,c.date_cde , c.date_ar , d.no_ligne , d.statut , d.code_ar , d.qte_cde ,d.qte_liv, d.delai_s , d.delai_p ,  b.quantite, b.code_article ,b.no_ligne ,e.date_bl
    from 
     
    gfcoe as c
     
    left outer join gfcol as d
    on d.no_ar = c.no_ar
     
    left outer join gfble as e
    on e.no_ar = c.no_ar
     
    left outer join gfbll as b
    on b.no_bl = e.no_bl and b.no_ligne = d.no_ligne
     
     
     
     
    where c.no_ar = '15.1774'
     
    group by c.no_ar ,c.client ,c.date_cde , c.date_ar , d.no_ligne , d.statut , d.code_ar , d.qte_cde ,d.qte_liv, d.delai_s , d.delai_p ,  b.quantite, b.code_article ,b.no_ligne , e.date_bl
    Voici mon resultat

    Nom : resultat.PNG
Affichages : 79
Taille : 31,7 Ko


    Je ne comprend pas pourquoi j'ai des lignes qui se double , en plus des ligne avec une date de livraison.

    Merci de tes lumières,
    Commandeur

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 130
    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 130
    Points : 38 543
    Points
    38 543
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Commandeur Voir le message
    Je ne comprend pas pourquoi j'ai des lignes qui se doublent , en plus des ligne avec une date de livraison.
    C'est du à ce que, contrairement à ce que vous a proposé Artemus24, vous sélectionnez les colonnes des tables BL gfble et détail BL gfbll sans fonction d'aggrégation
    (max, avg, sum etc...), la réponse proposée par Artemus24 correspond à votre expression de besoin initial, reprenez la requete telle qu'elle si votre besoin reste inchangé

  8. #8
    Membre régulier
    Inscrit en
    Août 2003
    Messages
    228
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 228
    Points : 92
    Points
    92
    Par défaut
    Sa ne fonctionne pas , voici ma requette :

    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
    select  c.no_ar ,c.client ,c.date_cde , c.date_ar , d.no_ligne , d.statut , d.code_ar , d.qte_cde ,d.qte_liv, d.delai_s , d.delai_p ,  b.quantite, b.code_article ,b.no_ligne , b.no_bl,
     
    max(e.date_bl)          as Date_Max,
    count(distinct b. no_bl) as Nbre_Bl,
    sum(b.quantite)          as Qte_Tot_Liv
     
    from 
     
    gfcoe as c
     
    left outer join gfcol as d
    on d.no_ar = c.no_ar
     
    left outer join gfble as e
    on e.no_ar = c.no_ar
     
    left outer join gfbll as b
    on b.no_bl = e.no_bl and b.no_ligne = d.no_ligne
     
     
    where c.no_ar = '15.1774'
     
    group by c.no_ar ,c.client ,c.date_cde , c.date_ar , d.no_ligne , d.statut , d.code_ar , d.qte_cde ,d.qte_liv, d.delai_s , d.delai_p ,  b.quantite, b.code_article ,b.no_ligne , b.no_bl
    Nom : resultat2.PNG
Affichages : 70
Taille : 19,9 Ko
    Images attachées Images attachées  
    Commandeur

  9. #9
    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 378
    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 378
    Points : 19 054
    Points
    19 054
    Par défaut
    Salut comandeur.

    1) il y a, je trouve, une redondance, dans le fait de mettre client dans la table gcol et gble.
    Il me semble, qu'un numéro d'article appartient à un seul client.
    De ce fait, il est inutile de le mettre à nouveau dans la table gble.

    2) la multiplication des lignes dont tu parles provient de l'inversion des tables gbll et gble dans la requête.

    3) j'ai repris ton nouveau exemple (et c'est la dernière fois que je le fais), afin de résoudre ta sélection des lignes comme tu me l'a demandé.
    Cela me semblait bizarre d'avoir toujours la même date (date_bl) pour ton exemple.
    Ce problème provenait de l'inversion des tables gbll et gble dans la requête.
    Dans ton exemple, tu as un unique bon de livraison (bl) pour un numéro de ligne et cette fois-ci, tu obtiens la bonne date.
    Si ton schéma te le permet, tu peux mettre plusieurs bl pour un même numéro de ligne et obtenir dans ce cas précis, la plus grande date.

    4) voici ce que tu recherches à faire :
    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
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `gfcoe`
    --------------
     
    --------------
    CREATE TABLE `gfcoe`
    (
      `client`    integer unsigned  NOT NULL,
      `date_cde`  date              NOT NULL,
      `no_ar`     char(07)          NOT NULL primary key
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `gfcoe` (`client`, `date_cde`, `no_ar`) VALUES
    (140, '2015-12-07', '15.1774')
    --------------
     
    --------------
    select * from gfcoe
    --------------
     
    +--------+------------+---------+
    | client | date_cde   | no_ar   |
    +--------+------------+---------+
    |    140 | 2015-12-07 | 15.1774 |
    +--------+------------+---------+
    --------------
    DROP TABLE IF EXISTS `gfcol`
    --------------
     
    --------------
    CREATE TABLE `gfcol`
    (
      `no_ar`     char(07)          NOT NULL,
      `no_ligne`  integer unsigned  NOT NULL,
      `statut`    char(01)          NOT NULL,
      `code_ar`   char(09)          NOT NULL,
      `client`    integer unsigned  NOT NULL,
      `qte_cde`   integer unsigned  NOT NULL,
      `qte_liv`   integer unsigned  NOT NULL,
      `delai_s`   date              NOT NULL,
      `delai_p`   date              NOT NULL,
      primary key (`no_ar`,`no_ligne`),
      CONSTRAINT `FK_01` FOREIGN KEY (`no_ar`) REFERENCES `gfcoe` (`no_ar`) ON DELETE RESTRICT ON UPDATE CASCADE
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `gfcol` (`no_ar`,`no_ligne`,`statut`,`code_ar`,`client`,`qte_cde`,`qte_liv`,`delai_s`,`delai_p`) VALUES
    ('15.1774', 1, 'f', 'ELX0093-A', 140, 150,  0, '2016-03-18', '2016-01-15'),
    ('15.1774', 2, 'f', 'ADV0764',   140, 270,  0, '2016-03-18', '2016-01-15'),
    ('15.1774', 3, 's', 'ELX0093-A', 140,  96, 96, '2016-02-10', '2016-01-15'),
    ('15.1774', 4, 'f', 'ADV0764' ,  140, 200,  0, '2016-03-18', '2016-01-15'),
    ('15.1774', 5, 's', 'ELX0093-A', 140,  96, 95, '2016-03-04', '2016-03-04'),
    ('15.1774', 6, 's', 'ADV0764',   140,  30, 33, '2016-03-04', '2016-03-04')
    --------------
     
    --------------
    select * from gfcol
    --------------
     
    +---------+----------+--------+-----------+--------+---------+---------+------------+------------+
    | no_ar   | no_ligne | statut | code_ar   | client | qte_cde | qte_liv | delai_s    | delai_p    |
    +---------+----------+--------+-----------+--------+---------+---------+------------+------------+
    | 15.1774 |        1 | f      | ELX0093-A |    140 |     150 |       0 | 2016-03-18 | 2016-01-15 |
    | 15.1774 |        2 | f      | ADV0764   |    140 |     270 |       0 | 2016-03-18 | 2016-01-15 |
    | 15.1774 |        3 | s      | ELX0093-A |    140 |      96 |      96 | 2016-02-10 | 2016-01-15 |
    | 15.1774 |        4 | f      | ADV0764   |    140 |     200 |       0 | 2016-03-18 | 2016-01-15 |
    | 15.1774 |        5 | s      | ELX0093-A |    140 |      96 |      95 | 2016-03-04 | 2016-03-04 |
    | 15.1774 |        6 | s      | ADV0764   |    140 |      30 |      33 | 2016-03-04 | 2016-03-04 |
    +---------+----------+--------+-----------+--------+---------+---------+------------+------------+
    --------------
    DROP TABLE IF EXISTS `gfble`
    --------------
     
    --------------
    CREATE TABLE `gfble`
    (
      `date_bl`  date              NOT NULL,
      `no_ar`    char(07)          NOT NULL,
      `no_bl`    integer unsigned  NOT NULL,
      primary key (no_ar, no_bl),
      CONSTRAINT `FK_02` FOREIGN KEY (`no_ar`) REFERENCES `gfcoe` (`no_ar`) ON DELETE RESTRICT ON UPDATE CASCADE
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `gfble` (`date_bl`,`no_ar`,`no_bl`) VALUES
    ('2016-03-02', '15.1774', 18595),
    ('2016-02-29', '15.1774', 18575),
    ('2016-02-02', '15.1774', 18417)
    --------------
     
    --------------
    select * from gfble
    --------------
     
    +------------+---------+-------+
    | date_bl    | no_ar   | no_bl |
    +------------+---------+-------+
    | 2016-02-02 | 15.1774 | 18417 |
    | 2016-02-29 | 15.1774 | 18575 |
    | 2016-03-02 | 15.1774 | 18595 |
    +------------+---------+-------+
    --------------
    DROP TABLE IF EXISTS `gfbll`
    --------------
     
    --------------
    CREATE TABLE `gfbll`
    (
      `code_article` char(09)          NOT NULL,
      `cadence`      char(07)          NOT NULL,
      `no_bl`        integer unsigned  NOT NULL,
      `no_ligne`     integer unsigned  NOT NULL,
      `quantite`     integer unsigned  NOT NULL,
      primary key (`code_article`,`no_ligne`),
      CONSTRAINT `FK_03` FOREIGN KEY (`cadence`, `no_bl`) REFERENCES `gfble` (`no_ar`, `no_bl`) ON DELETE RESTRICT ON UPDATE CASCADE
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `gfbll` (`code_article`,`cadence`,`no_bl`,`no_ligne`,`quantite`) VALUES
    ('ELX0093-A', '15.1774', 18417, 3, 96),
    ('ADV0764',   '15.1774', 18575, 6, 33),
    ('ELX0093-A', '15.1774', 18595, 5, 95)
    --------------
     
    --------------
    select * from gfbll
    --------------
     
    +--------------+---------+-------+----------+----------+
    | code_article | cadence | no_bl | no_ligne | quantite |
    +--------------+---------+-------+----------+----------+
    | ADV0764      | 15.1774 | 18575 |        6 |       33 |
    | ELX0093-A    | 15.1774 | 18417 |        3 |       96 |
    | ELX0093-A    | 15.1774 | 18595 |        5 |       95 |
    +--------------+---------+-------+----------+----------+
    --------------
    select  c.no_ar,  c.client,  c.date_cde, d.no_ligne,
            d.statut, d.code_ar, d.qte_cde,  d.qte_liv,
     
            max(e.date_bl)               as Date_Max,
            count(distinct b.no_bl)      as Nbre_Bl,
            sum(coalesce(b.quantite, 0)) as Qte_Tot_Liv
    from            gfcoe as c
     
    left outer join gfcol as d
    on  d.no_ar  = c.no_ar
    and d.client = c.client
     
    left outer join gfbll as b
    on  b.cadence      = c.no_ar
    and b.cadence      = d.no_ar
    and b.no_ligne     = d.no_ligne
    and b.code_article = d.code_ar
     
    left outer join gfble as e
    on  e.no_ar        = c.no_ar
    and e.no_ar        = d.no_ar
    and e.no_ar        = b.cadence
    and e.no_bl        = b.no_bl
     
    where c.no_ar = '15.1774'
     
    group by c.no_ar,  c.client,  c.date_cde, d.no_ligne,
             d.statut, d.code_ar, d.qte_cde,  d.qte_liv
     
    order by c.no_ar,  c.client,  c.date_cde, d.no_ligne,
             d.statut, d.code_ar, d.qte_cde,  d.qte_liv
    --------------
     
    +---------+--------+------------+----------+--------+-----------+---------+---------+------------+---------+-------------+
    | no_ar   | client | date_cde   | no_ligne | statut | code_ar   | qte_cde | qte_liv | Date_Max   | Nbre_Bl | Qte_Tot_Liv |
    +---------+--------+------------+----------+--------+-----------+---------+---------+------------+---------+-------------+
    | 15.1774 |    140 | 2015-12-07 |        1 | f      | ELX0093-A |     150 |       0 | NULL       |       0 |           0 |
    | 15.1774 |    140 | 2015-12-07 |        2 | f      | ADV0764   |     270 |       0 | NULL       |       0 |           0 |
    | 15.1774 |    140 | 2015-12-07 |        3 | s      | ELX0093-A |      96 |      96 | 2016-02-02 |       1 |          96 |
    | 15.1774 |    140 | 2015-12-07 |        4 | f      | ADV0764   |     200 |       0 | NULL       |       0 |           0 |
    | 15.1774 |    140 | 2015-12-07 |        5 | s      | ELX0093-A |      96 |      95 | 2016-03-02 |       1 |          95 |
    | 15.1774 |    140 | 2015-12-07 |        6 | s      | ADV0764   |      30 |      33 | 2016-02-29 |       1 |          33 |
    +---------+--------+------------+----------+--------+-----------+---------+---------+------------+---------+-------------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
     
    Appuyez sur une touche pour continuer...
    En fonction des informations que tu m'as communiqué, je pense que tu as la solution.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  10. #10
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 130
    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 130
    Points : 38 543
    Points
    38 543
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Artemus24 Voir le message
    1) il y a, je trouve, une redondance, dans le fait de mettre client dans la table gcol et gble
    En effet

    Citation Envoyé par Artemus24 Voir le message
    Il me semble, qu'un numéro d'article appartient à un seul client.
    Non, peut être vouliez vous dire qu'un numéro de bordereau de livraison, ne concerne qu'un seul client

    Citation Envoyé par Artemus24 Voir le message
    De ce fait, il est inutile de le mettre à nouveau dans la table gble.
    Mais oui quand même

  11. #11
    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 378
    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 378
    Points : 19 054
    Points
    19 054
    Par défaut
    Salut Escartefigue.

    Citation Envoyé par escartefigue
    Non, peut être vouliez vous dire qu'un numéro de bordereau de livraison, ne concerne qu'un seul client
    Je suis d'accord sur le fait de dire qu'un Bordereau de Livraison concerne bien un unique client. Mais je ne parlais pas de cela.

    Un code article est indépendant de tout client.
    Pour associer une liste d'articles à un client, il faut créer un bordereau de commande, et de ce fait, créer un numéro de commande qui servira d'identifiant à cette table.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  12. #12
    Membre régulier
    Inscrit en
    Août 2003
    Messages
    228
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 228
    Points : 92
    Points
    92
    Par défaut
    Merci de vos réponses,

    Effectivement je me suis redut compte de mon inversion des tables dans ma requête.

    Pour les tables , c'est pas ma création . mais je suis d'accord avec vous.

    Grand merci a vous tous pour votre aide, sa ma permis d'avancer son mon apprentissage des SQl.
    Commandeur

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

Discussions similaires

  1. Pb requête imbriquée
    Par ddams dans le forum Requêtes
    Réponses: 11
    Dernier message: 20/04/2004, 12h13
  2. [Requête] Faire une requête imbriquée?
    Par sekiryou dans le forum Requêtes
    Réponses: 2
    Dernier message: 17/01/2004, 22h52
  3. problème avec une requête imbriquée
    Par jaimepasteevy dans le forum Langage SQL
    Réponses: 13
    Dernier message: 05/12/2003, 10h29
  4. Requêtes imbriquées ?
    Par Ph. B. dans le forum XMLRAD
    Réponses: 7
    Dernier message: 06/05/2003, 13h19
  5. Requête imbriquée et indexes INTERBASE
    Par vadim dans le forum InterBase
    Réponses: 2
    Dernier message: 06/09/2002, 16h15

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