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 :

Requête pour compter le nombre d'occurence sur plusieurs colonnes


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 88
    Points : 40
    Points
    40
    Par défaut Requête pour compter le nombre d'occurence sur plusieurs colonnes
    Bonjour,

    Voici mon problème : j'ai une table qui contient plusieurs dizaines de ligne sous cette forme :


    idligne numero1 numero2 numero3 numero4 numero5
    1 33 24 12 19 20
    2 12 13 32 36 20
    3 15 17 19 12 33

    La requête que je cherche à créer doit pouvoir me trouver combien de fois (c'est une somme) les numéros 12, 20 et 33 apparaissent dans les champs numero1, numero2, numero3, numero4, numero5.
    Pour l'exemple la requête doit me retourner : 7

    Avez vous une idée ?

    Je reste connecté.

    Merci d'avance pour votre aide.

  2. #2
    Membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Juin 2014
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 31
    Points : 66
    Points
    66
    Par défaut
    Les valeurs que tu recherche (ici 12,20,33) sont figées ou tu compte les passer en paramètre pour en rechercher d'autres ?
    Si c'est fixe, tu peux regarder du coté de l'instruction if en SQL

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 88
    Points : 40
    Points
    40
    Par défaut
    Oui c'est fixe pour l'instant mais ca ne le sera pas sur le long terme.

    Avec if ? Comment ca ?

  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 607
    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 607
    Points : 19 829
    Points
    19 829
    Par défaut
    Sakut ghostfile.

    Si tu commençais par définir correctement ta table, tu n'aurais pas ce genre de problème.
    Une ligne de ta table doit correspondre à 1 case de ton tableau.
    Il suffit alors de définir, en tant que clef, la ligne et la colonne de ton tableau.

    Voici ce que je te propose de 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
    --------------
    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 `test`
    --------------
     
    --------------
    CREATE TABLE `test`
    (
      `lig` int unsigned NOT NULL,
      `col` int unsigned NOT NULL,
      `val` int unsigned NOT NULL,
      PRIMARY KEY (`lig`,`col`)
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `test` (`lig`,`col`,`val`) values
      (1, 1, 33), (1, 2, 24), (1, 3, 12), (1, 4, 19), (1, 5, 20),
      (2, 1, 12), (2, 2, 13), (2, 3, 32), (2, 4, 36), (2, 5, 20),
      (3, 1, 15), (3, 2, 17), (3, 3, 19), (3, 4, 12), (3, 5, 33)
    --------------
     
    --------------
    select * from test
    --------------
     
    +-----+-----+-----+
    | lig | col | val |
    +-----+-----+-----+
    |   1 |   1 |  33 |
    |   1 |   2 |  24 |
    |   1 |   3 |  12 |
    |   1 |   4 |  19 |
    |   1 |   5 |  20 |
    |   2 |   1 |  12 |
    |   2 |   2 |  13 |
    |   2 |   3 |  32 |
    |   2 |   4 |  36 |
    |   2 |   5 |  20 |
    |   3 |   1 |  15 |
    |   3 |   2 |  17 |
    |   3 |   3 |  19 |
    |   3 |   4 |  12 |
    |   3 |   5 |  33 |
    +-----+-----+-----+
    --------------
    select count(*) from test where val in (12,20,33)
    --------------
     
    +----------+
    | count(*) |
    +----------+
    |        7 |
    +----------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
     
    Appuyez sur une touche pour continuer...
    @+

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

    Voici une solution pas très élégante mais simple :

    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
     
    WITH TMP AS                        
        (SELECT                        
         CASE                          
           WHEN MT01 IN (12, 20, 33)   
           THEN 1                      
           ELSE 0                      
           END AS XX01                 
        ,CASE                          
           WHEN MT02 IN (12, 20, 33)   
           THEN 1                      
           ELSE 0                      
           END AS XX02                 
        ,CASE                          
           WHEN MT03 IN (12, 20, 33)   
           THEN 1                      
           ELSE 0                      
           END AS XX03                 
        ,CASE                                      
           WHEN MT04 IN (12, 20, 33)               
           THEN 1                                  
           ELSE 0                                  
           END AS XX04                             
        ,CASE                                      
           WHEN MT05 IN (12, 20, 33)               
           THEN 1                                  
           ELSE 0                                  
           END AS XX05                             
         FROM MATABLE)                           
    SELECT SUM(XX01+XX02+XX03+XX04+XX05) FROM TMP ;

  6. #6
    Membre à l'essai
    Inscrit en
    Août 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 9
    Points : 17
    Points
    17
    Par défaut
    Hello,

    Une autre approche (finalement assez similaire), également pas très élégante mais immédiate :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT
    COUNT(IF(n1 IN (12,20,33),1,NULL))+
    COUNT(IF(n2 IN (12,20,33),1,NULL))+
    COUNT(IF(n3 IN (12,20,33),1,NULL))+
    COUNT(IF(n4 IN (12,20,33),1,NULL))+
    COUNT(IF(n5 IN (12,20,33),1,NULL)) AS RES
    FROM test;
    Je suis d'accord avec ce qui a été dit plus haut en revanche concernant la définition même de ta table...

    A+

  7. #7
    Membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Juin 2014
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 31
    Points : 66
    Points
    66
    Par défaut
    Citation Envoyé par cg_seb94 Voir le message
    Hello,

    Une autre approche (finalement assez similaire), également pas très élégante mais immédiate :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT
    COUNT(IF(n1 IN (12,20,33),1,NULL))+
    COUNT(IF(n2 IN (12,20,33),1,NULL))+
    COUNT(IF(n3 IN (12,20,33),1,NULL))+
    COUNT(IF(n4 IN (12,20,33),1,NULL))+
    COUNT(IF(n5 IN (12,20,33),1,NULL)) AS RES
    FROM test;
    Je suis d'accord avec ce qui a été dit plus haut en revanche concernant la définition même de ta table...

    A+
    C'est effectivement ce a quoi je pensais. Cependant dans le cadre de 4 ou 5 colonnes c'est jouable si il y en a 20 - 30 ça va devenir pénible...

  8. #8
    Invité
    Invité(e)
    Par défaut
    J'ajoute également un avis très positif sur la structuration de table proposée par Artemus24.

    Imagine qu'un jour tu ais plus de colonnes que ton SGDB ne sache en gérer.
    Tu feras comment ?
    La solution d'Artemus24 est LA solution pour l'avenir.

Discussions similaires

  1. Requête pour compter le nombre de lignes d'une procédure stockée?
    Par toutounesan dans le forum Développement
    Réponses: 13
    Dernier message: 06/06/2012, 13h59
  2. Requête pour compter le nombre d'interventions
    Par gwadajm dans le forum Langage SQL
    Réponses: 14
    Dernier message: 29/12/2011, 20h57
  3. [XL-2007] MACRO pour compter le nombre des fichiers sur le serveur FTP
    Par kinkichin dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 04/07/2011, 19h09
  4. [AC-2000] Création d'une requête pour compter le nombre de ok dans une ligne
    Par yassine06 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 31/05/2010, 17h10
  5. [XL-2007] Compter le nombre d'occurences sur plusieurs feuilles
    Par grping dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 05/10/2009, 19h18

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