IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Problème de requête SQL avec DISTINCT et COUNT ?


Sujet :

Langage SQL

  1. #1
    Membre averti
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Points : 381
    Points
    381
    Par défaut Problème de requête SQL avec DISTINCT et COUNT ?
    Bonjour,

    J'ai la table suivante dans une base Firebird SQL v2.0 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    CREATE TABLE TIRAGES (
      JOUR DATE NOT NULL,
      NOMBRE1 SMALLINT NOT NULL,
      NOMBRE2 SMALLINT NOT NULL,
      NOMBRE3 SMALLINT NOT NULL,
      NOMBRE4 SMALLINT NOT NULL,
      NOMBRE5 SMALLINT NOT NULL,
      NOMBRE6 SMALLINT NOT NULL);
     
    ALTER TABLE TIRAGES ADD PRIMARY KEY (JOUR);
    Je fais actuellement une requête du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT COUNT(JOUR) FROM TIRAGES WHERE NOMBRE1=1 OR NOMBRE2=1 OR NOMBRE3=1 OR NOMBRE4=1 OR NOMBRE5=1 OR NOMBRE6=1
    Je sais comme ça que le nombre 1 se retrouve 5 fois dans mes tirages.

    Le problème que je rencontre, c'est que je suis obligé de faire cette requête 49 fois pour avoir le nombre de fois où chaque nombre apparaît dans les tirages.

    Comment puis-je construire une requête SQL qui me donne un résultat du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    *---*---*
    * 1 * 5 *
    *---*---*
    * 2 * 1 *
    *---*---*
    * 3 * 0 *
    *---*---*
    [...]
    *----*---*
    * 48 * 4 *
    *----*---*
    * 49 * 9 *
    *----*---*
    Merci d'avance,
    ZiP

  2. #2
    Membre averti
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Points : 381
    Points
    381
    Par défaut
    Bonsoir,

    Je suis donc arrivé à ce résultat :
    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
     
    SELECT NOMBRE, COUNT(FREQUENCE) AS FREQUENCE FROM
    (
           SELECT NOMBRE1 AS NOMBRE, COUNT(NOMBRE1) AS FREQUENCE
           FROM TIRAGES
           GROUP BY NOMBRE1
     
           UNION ALL
     
           SELECT NOMBRE2 AS NOMBRE, COUNT(NOMBRE2) AS FREQUENCE
           FROM TIRAGES
           GROUP BY NOMBRE2
     
           UNION ALL
     
           SELECT NOMBRE3 AS NOMBRE, COUNT(NOMBRE3) AS FREQUENCE
           FROM TIRAGES
           GROUP BY NOMBRE3
     
           UNION ALL
     
           SELECT NOMBRE4 AS NOMBRE, COUNT(NOMBRE4) AS FREQUENCE
           FROM TIRAGES
           GROUP BY NOMBRE4
     
           UNION ALL
     
           SELECT NOMBRE5 AS NOMBRE, COUNT(NOMBRE5) AS FREQUENCE
           FROM TIRAGES
           GROUP BY NOMBRE5
     
           UNION ALL
     
           SELECT NOMBRE6 AS NOMBRE, COUNT(NOMBRE6) AS FREQUENCE
           FROM TIRAGES
           GROUP BY NOMBRE6
    ) TIRAGES GROUP BY NOMBRE ORDER BY FREQUENCE DESC
    Savez-vous si on peut optimiser ce code ?

    Merci,
    ZiP

  3. #3
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Bonjour,

    La requête s'exécute lentement ? La solution est bonne en tout cas. As-tu des index sur chaque colonne ? L'idéal dans ce cas est de restructurer la table si possible, pour avoir un schéma normalisé, avec une seule colonne Nombre par ligne de tirage, éventuellement avec une colonne de catégorie ou tout déterminant nécessaire.

  4. #4
    Membre averti
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Points : 381
    Points
    381
    Par défaut
    Bonjour,

    Non, elle s'exécute rapidement, mais comme le la trouve assez longue, je voulais savoir si il y avait plus simple avec l'architecture de ma table

    Merci,
    ZiP

  5. #5
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Je ne suis pas un spécialiste de l'optimisation sur Firebird, mais parlant SQL, je ne vois pas mieux en conservant ta structure.

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

Discussions similaires

  1. problème de requête sql avec c#
    Par majduuus dans le forum C#
    Réponses: 7
    Dernier message: 07/09/2013, 00h35
  2. Problème exécution requête SQL avec HSQLDB
    Par montis dans le forum JDBC
    Réponses: 1
    Dernier message: 23/03/2012, 09h37
  3. Problème de requête SQL avec Firebird ?
    Par MaTHieU_ dans le forum SQL
    Réponses: 3
    Dernier message: 18/09/2008, 09h23
  4. Réponses: 2
    Dernier message: 07/02/2008, 11h45
  5. Problème de requête SQL avec instruction TRANSFORM
    Par Nosper dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 21/06/2005, 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