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 :

Une colonne pour un WHERE et une autre pour un autre WHERE


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Mars 2015
    Messages : 16
    Points : 16
    Points
    16
    Par défaut Une colonne pour un WHERE et une autre pour un autre WHERE
    Bonjour à tous,

    J'ai un problème dont je me creuse le crâne depuis des jours et malgré mes recherches, je ne trouve pas de solution..
    Donc, je me suis décidé à vous poser la question ici.

    PROBLEME :

    J'ai une Table nommée "pictrel_est" avec cette structure :

    Cob Natop Posture PCE
    1 04 aa 12345678912345
    1 04 - 23456789123456
    4 03 ab 34567891234567

    et une autre table nommée "matrice_PIVAINE" :
    Cob Natop Posture PIVAINE
    1 04 - NON
    1 04 aa OUI
    4 03 ab OUI

    Souhaitant obtenir par jointure des deux tables ci-dessus la table suivante :
    Cob Natop PIVAINE_OUI PIVAINE_NON
    1 04 1 1
    4 03 1 0

    J'imaginai que la solution passait par un SELECT dans un SELECT, un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT 
         Cob, 
         Natop, 
         (SELECT count(PCE) FROM pictrel_est, matrice_PIVAINE WHERE (pictrel_est.Cob=matrice_PIVAINE AND pictrel_est.Natop=matrice_PIVAINE.Natop  
         AND pictrel_est.Posture=matrice_PIVAINE.Posture) AND matrice_PIVAINE="OUI"),
     
         (SELECT count(PCE) FROM pictrel_est, matrice_PIVAINE WHERE (pictrel_est.Cob=matrice_PIVAINE AND pictrel_est.Natop=matrice_PIVAINE.Natop 
         AND pictrel_est.Posture=matrice_PIVAINE.Posture) AND matrice_PIVAINE="NON") 
    FROM pictrel_est
    GROUP BY Cob, Natop
    Mais cela me retourne :

    Cob Natop PIVAINE_OUI PIVAINE_NON
    1 01 25560 74120
    1 30 25560 74120
    1 31 25560 74120
    ... ... 25560 74120

    En bref, il me liste bien tous mes différents Cob, toutes mes différentes Natop, mais il ne me compte pas les PIVAINE Oui & Non...

    Auriez-vous une idée?

    Merci milles fois par avance.
    Laurent

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 302
    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 302
    Points : 39 647
    Points
    39 647
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Essayez comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT SUBQ.COB
          ,SUBQ.NATOP
          ,SUM(SUBQ.NBOUI)                                            
          ,SUM(SUBQ.NBNON)   
    FROM
         (SELECT pictrel_est.COB
                ,pictrel_est.NATOP
                ,case when matrice_PIVAINE.PIVAINE = 'OUI' then 1 end as NBOUI
                ,case when matrice_PIVAINE.PIVAINE = 'NON' then 1 end as NBNON
          FROM   pictrel_est 
          LEFT OUTER JOIN matrice_PIVAINE
            ON matrice_PIVAINE.COB    = pictrel_est.COB
           AND matrice_PIVAINE..NATOP = pictrel_est.NATOP) as SUBQ
    GROUP BY SUBQ.COB, SUBQ.NATOP
    il y a peut être quelques fautes de syntaxe, je n'ai pas créé de cas de test pour le vérifier, mais ca devrait fonctionner
    J'ai mis une jointure outer, peut être préférez vous uniquement les enreg qui matchent, auquel cas remplacez par une jointure inner

  3. #3
    Membre à l'essai
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Mars 2015
    Messages : 16
    Points : 16
    Points
    16
    Par défaut
    Bonjour EscarteFigue,

    Grand merci pour votre réponse, je n'avais jamais utilisé les WHEN ... THEN.
    J'ai remis en forme votre requête pour l'adapter exactement aux noms exacts de mes tables, ce qui donne :

    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
     
    SELECT SUBQ.COB
          ,SUBQ.NATOP
          ,SUM(SUBQ.NBOUI)                                            
          ,SUM(SUBQ.NBNON)   
    FROM
         (SELECT `pictrel_est`.`Code Objet` as COB
                ,`pictrel_est`.`Natop` as NATOP
                ,case when `matrice_PIVAINE`.`PIVAINE` = 'OUI' then 1 end as NBOUI
                ,case when `matrice_PIVAINE`.`PIVAINE` = 'NON' then 1 end as NBNON
          FROM `pictrel_est` 
          LEFT OUTER JOIN `matrice_PIVAINE`
            ON `matrice_PIVAINE`.`Cob`    = `pictrel_est`.`Code Objet`
           AND `matrice_PIVAINE`.`Natop` = `pictrel_est`.`Natop`) as SUBQ
    GROUP BY SUBQ.COB, SUBQ.NATOP
    (J'ai ajouté un ALIAS dans le (SELECT) pour COB et NATOP).
    Je teste ça de suite et je vous dis ça.

  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 414
    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 414
    Points : 19 200
    Points
    19 200
    Par défaut
    Salut liandar.

    Je vous propose deux solutions, conformément au résultat que vous attendez.
    La première solution est assez proche de celle de 'escartefigue'.

    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
    --------------
    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 `pictrel_est`
    --------------
     
    --------------
    CREATE TABLE `pictrel_est`
    (
      `cob`      smallint NOT NULL,
      `natop`    char(02) NOT NULL,
      `posture`  char(02) NOT NULL,
      `pce`      char(14) NOT NULL,
      PRIMARY KEY (`cob`,`natop`,`posture`)
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO pictrel_est (`cob`,`natop`,`posture`,`pce`) VALUES
    (1, '04',       'aa', '12345678912345'),
    (1, '04',       '--', '23456789123456'),
    (4, '03',       'ab', '34567891234567')
    --------------
     
    --------------
    select * from pictrel_est
    --------------
     
    +-----+-------+---------+----------------+
    | cob | natop | posture | pce            |
    +-----+-------+---------+----------------+
    |   1 | 04    | --      | 23456789123456 |
    |   1 | 04    | aa      | 12345678912345 |
    |   4 | 03    | ab      | 34567891234567 |
    +-----+-------+---------+----------------+
    --------------
    DROP TABLE IF EXISTS `matrice_PIVAINE`
    --------------
     
    --------------
    CREATE TABLE `matrice_PIVAINE`
    (
      `cob`      smallint NOT NULL,
      `natop`    char(02) NOT NULL,
      `posture`  char(02) NOT NULL,
      `PIVAINE`  char(03) NOT NULL,
      PRIMARY KEY (`cob`,`natop`,`posture`)
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO matrice_PIVAINE (`cob`,`natop`,`posture`,`pivaine`) VALUES
    (1, '04', '--', 'NON'),
    (1, '04', 'aa', 'OUI'),
    (4, '03', 'ab', 'OUI')
    --------------
     
    --------------
    select * from matrice_PIVAINE
    --------------
     
    +-----+-------+---------+---------+
    | cob | natop | posture | PIVAINE |
    +-----+-------+---------+---------+
    |   1 | 04    | --      | NON     |
    |   1 | 04    | aa      | OUI     |
    |   4 | 03    | ab      | OUI     |
    +-----+-------+---------+---------+
    --------------
    select tb1.cob,
           tb1.natop,
           sum(case when tb2.PIVAINE = 'OUI' then 1 else 0 end) as 'Pivaine_oui',
           sum(case when tb2.PIVAINE = 'NON' then 1 else 0 end) as 'Pivaine_non'
    FROM       pictrel_est      as tb1
    INNER JOIN matrice_PIVAINE  as tb2
    ON  tb2.COB     = tb1.COB
    AND tb2.NATOP   = tb1.NATOP
    AND tb2.POSTURE = tb1.POSTURE
    GROUP BY tb1.COB, tb1.NATOP
    --------------
     
    +-----+-------+-------------+-------------+
    | cob | natop | Pivaine_oui | Pivaine_non |
    +-----+-------+-------------+-------------+
    |   1 | 04    |           1 |           1 |
    |   4 | 03    |           1 |           0 |
    +-----+-------+-------------+-------------+
    --------------
    select   cob,
             natop,
             sum(case when PIVAINE = 'OUI' then 1 else 0 end) as 'Pivaine_oui',
             sum(case when PIVAINE = 'NON' then 1 else 0 end) as 'Pivaine_non'
    FROM     matrice_PIVAINE
    GROUP BY COB, NATOP
    --------------
     
    +-----+-------+-------------+-------------+
    | cob | natop | Pivaine_oui | Pivaine_non |
    +-----+-------+-------------+-------------+
    |   1 | 04    |           1 |           1 |
    |   4 | 03    |           1 |           0 |
    +-----+-------+-------------+-------------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
     
    Appuyez sur une touche pour continuer...
    Je vous ai mis la structure des tables et j'ai fait en sorte que la 'primary key' soit le triplé ('cob', 'natop', 'posture').
    Si ce n'est pas le cas dans vos tables, vous risquez de ne pas obtenir les bons résultats à cause de la non unicité de ce triplé.

    @+

  5. #5
    Membre à l'essai
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Mars 2015
    Messages : 16
    Points : 16
    Points
    16
    Par défaut
    Bonjour Artemus24,

    C'est votre requête qui était quasiment la bonne ! Un énorme merci, j'ai fini par trouver ce qui me convient :


    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
     
    SELECT 
    TU.NATOP as "TU_NATOP", TU.COB as "TU_COB",
    sum(case when TU.PIVAINE = 'OUI' then 1 end) as "TU_PIVAINE",
    sum(case when TU.PIVAINE = 'NON' then 1 end) as "TU_PINONVAINE"
    FROM
         (SELECT `pictrel_est`.`Natop` as "NATOP", 
         `pictrel_est`.`Code Objet` as "COB",
         `matrice_PIVAINE`.`PIVAINE` as "PIVAINE"
         FROM `pictrel_est`
              LEFT OUTER JOIN `matrice_PIVAINE`
              ON `matrice_PIVAINE`.`Cob`=`pictrel_est`.`Code Objet`
              AND `matrice_PIVAINE`.`Natop`=`pictrel_est`.`Natop`
              AND `matrice_PIVAINE`.`Posture`=`pictrel_est`.`Posture`
         UNION ALL
         SELECT `pictrel_ouest`.`Natop` as "NATOP",
         `pictrel_ouest`.`Code Objet` as "COB",
         `matrice_PIVAINE`.`PIVAINE` as "PIVAINE"
         FROM `pictrel_ouest` 
              LEFT OUTER JOIN `matrice_PIVAINE`
              ON `matrice_PIVAINE`.`Cob`=`pictrel_ouest`.`Code Objet`
              AND `matrice_PIVAINE`.`Natop`=`pictrel_ouest`.`Natop`
              AND `matrice_PIVAINE`.`Posture`=`pictrel_ouest`.`Posture`
         UNION ALL
         SELECT `pictrel_paris`.`Natop` as "NATOP", 
         `pictrel_paris`.`Code Objet` as "COB",
         `matrice_PIVAINE`.`PIVAINE` as "PIVAINE"
         FROM `pictrel_paris`
         LEFT OUTER JOIN `matrice_PIVAINE`
              ON `matrice_PIVAINE`.`Cob`=`pictrel_paris`.`Code Objet`
              AND `matrice_PIVAINE`.`Natop`=`pictrel_paris`.`Natop`
              AND `matrice_PIVAINE`.`Posture`=`pictrel_paris`.`Posture`) as TU
    GROUP BY TU.NATOP, TU.COB
    ORDER BY TU.NATOP, TU.COB
    Encore merci à tous pour l'aide.

  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 414
    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 414
    Points : 19 200
    Points
    19 200
    Par défaut
    Salut liandar.

    Merci pour votre gentillesse.
    Si vous avez besoin d'un autre service, je reste à votre disposition.

    @+

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 08/05/2015, 10h23
  2. Réponses: 3
    Dernier message: 18/02/2009, 18h00
  3. [Dates] Calendrier ou autre pour la séléction d'une date
    Par RadicalBob dans le forum Langage
    Réponses: 1
    Dernier message: 27/04/2007, 17h36
  4. [vba]un onglet tabstrip pour chaque terme d' une colonne
    Par CIBOOX dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 12/03/2007, 09h33
  5. Réponses: 3
    Dernier message: 22/10/2006, 23h15

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