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 :

Tableau croisé et fonction COUNT(DISTINCT( CHAMP )) [MySQL-5.6]


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 6
    Points : 9
    Points
    9
    Par défaut Tableau croisé et fonction COUNT(DISTINCT( CHAMP ))
    Bonjour à tous,

    Quelques infos pratiques avant de commencer (je ne sais pas si toutes les infos seront utiles)

    OS : Windows 7
    Interface d'utilisation de MySQL : phpMyAdmin via WAMP
    Forme d'utilisation de MySQL : SQL pure (pas d'intégration avec du PHP ou autres)
    Niveau en SQL : Novice - J'ai quand même les notions de base

    Détails de ce qui me pose question :

    Je dispose d'une base de donnée SQL sous cette forme (version très simplifiée, mais qui résume bien ce que je souhaite faire par la suite) : base_test.zip

    Nom : bdd_base_test.jpg
Affichages : 413
Taille : 48,4 Ko

    Mon but était de réorganiser l'information de manière à obtenir ceci :

    Nom : resultat_attendu_base_test.jpg
Affichages : 511
Taille : 14,8 Ko

    Il s'agissait donc de réaliser en quelque sorte un tableau croisé (pas dynamique) en SQL.

    J'ai réussi à trouver ma requête miracle après quelques recherches :

    SELECT
    `Parcelle`,
    COUNT(DISTINCT(IF(year(`Date_travaux`)='2003', `Date_travaux`, 0)))-1 AS "2003",
    COUNT(DISTINCT(IF(year(`Date_travaux`)='2004', `Date_travaux`, 0)))-1 AS "2004",
    COUNT(DISTINCT(IF(year(`Date_travaux`)='2005', `Date_travaux`, 0)))-1 AS "2005",
    COUNT(DISTINCT(IF(year(`Date_travaux`)='2006', `Date_travaux`, 0)))-1 AS "2006",
    COUNT(DISTINCT(IF(year(`Date_travaux`)='2007', `Date_travaux`, 0)))-1 AS "2007",
    COUNT(DISTINCT(IF(year(`Date_travaux`)='2008', `Date_travaux`, 0)))-1 AS "2008"
    FROM `base_test`
    GROUP BY `Parcelle`
    ORDER BY `Parcelle` ASC;
    Ma question :

    Pourquoi suis-je obligé de soustraire -1 à chacun de mes COUNT(DISTINCT( CHAMP )) pour obtenir le résultat souhaité ?

    En lisant un peu de doc, j'ai lu que la fonction COUNT ne renvoyait pas de résultat nul. Mais j'ai du mal avec cette notion car je ne vois pas pourquoi ça renvoie 1 quand il n'y a rien à compter, 2 quand il n'y a qu'une valeur à compter, 3 quand il n'y a que deux valeurs à compter, etc.

    Pour info, voici le résultat si je supprime les -1 à chacun de mes COUNT(DISTINCT( CHAMP )) :

    Nom : resultat_obtenu_base_test.jpg
Affichages : 372
Taille : 14,6 Ko

    Je vois bien que quelque chose cloche dans ma requête (car je ne pense pas que ce soit normal d'être obligé de soustraire 1 à chaque fois), mais je n'arrive pas à cerner vraiment le problème... Si quelqu'un peut m'apporter ses lumières, ce serait très sympa.

    Au passage, en réalisant cet exercice, je me suis bien rendu compte que le SQL n'était pas idéal pour créer des tableaux croisés, mais je suis du genre obstiné quand j'ai une idée en tête. Du coup je ne voulais pas lâcher l'affaire tant que je n'étais pas arrivé à afficher le résultat souhaité.

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    C'est à cause du 0 que vous comptez.
    Remplacez le par NULL ou mieux utilisez CASE qui est l'équivalent normatif du IF en plus puissant.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 6
    Points : 9
    Points
    9
    Par défaut
    Merci beaucoup skuatamad !

    Du coup je me sens vraiment NULL d'être passé à côté de ce détail... (je pars me cacher, j'ai honte de mon jeu de mot )

    Donc effectivement ça fonctionne mieux avec la requête suivante :

    SELECT
    `Parcelle`,
    COUNT(DISTINCT(IF(year(`Date_travaux`)='2003', `Date_travaux`, NULL ))) AS "2003",
    COUNT(DISTINCT(IF(year(`Date_travaux`)='2004', `Date_travaux`, NULL ))) AS "2004",
    COUNT(DISTINCT(IF(year(`Date_travaux`)='2005', `Date_travaux`, NULL ))) AS "2005",
    COUNT(DISTINCT(IF(year(`Date_travaux`)='2006', `Date_travaux`, NULL ))) AS "2006",
    COUNT(DISTINCT(IF(year(`Date_travaux`)='2007', `Date_travaux`, NULL ))) AS "2007",
    COUNT(DISTINCT(IF(year(`Date_travaux`)='2008', `Date_travaux`, NULL ))) AS "2008"
    FROM `base_test`
    GROUP BY `Parcelle`
    ORDER BY `Parcelle` ASC;
    Et donc d'après vos conseils encore mieux avec la requête suivante (qui fonctionne très bien après essai) :

    SELECT
    `Parcelle`,
    COUNT(DISTINCT(CASE WHEN year(`Date_travaux`)='2003' THEN `Date_travaux` ELSE NULL END)) AS "2003",
    COUNT(DISTINCT(CASE WHEN year(`Date_travaux`)='2004' THEN `Date_travaux` ELSE NULL END)) AS "2004",
    COUNT(DISTINCT(CASE WHEN year(`Date_travaux`)='2005' THEN `Date_travaux` ELSE NULL END)) AS "2005",
    COUNT(DISTINCT(CASE WHEN year(`Date_travaux`)='2006' THEN `Date_travaux` ELSE NULL END)) AS "2006",
    COUNT(DISTINCT(CASE WHEN year(`Date_travaux`)='2007' THEN `Date_travaux` ELSE NULL END)) AS "2007",
    COUNT(DISTINCT(CASE WHEN year(`Date_travaux`)='2008' THEN `Date_travaux` ELSE NULL END)) AS "2008"
    FROM `base_test`
    GROUP BY `Parcelle`
    ORDER BY `Parcelle` ASC;
    Merci encore !

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

Discussions similaires

  1. COUNT(DISTINCT champ) et GROUP BY
    Par redah75 dans le forum Requêtes
    Réponses: 5
    Dernier message: 29/11/2013, 13h39
  2. DISTINCT et COUNT dans tableau croisé dynamique
    Par tcorcy dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 28/08/2012, 17h18
  3. [AC-2003] Select count(distinct champ) impossible
    Par js8bleu dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 07/01/2010, 10h13
  4. Réponses: 2
    Dernier message: 16/11/2007, 09h59
  5. Tableau croisé dynamique Champs texte et numérique
    Par mooh91 dans le forum Requêtes et SQL.
    Réponses: 14
    Dernier message: 18/09/2006, 20h07

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