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 :

Probleme de comptage


Sujet :

Langage SQL

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    849
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 849
    Par défaut Probleme de comptage
    Je voudrais compter le nombre d'élèments différents, mais si j'ai un null chaque élèment est considéré comme différents.

    Exemple: Dans mon tableau j'ai
    Id Champs
    1 A
    2 null
    3 A
    4 null
    J'aurais donc 3 éléménts différents (un A, et deux null)

    Id Champs
    1 A
    2 null
    3 A
    4 null
    5 B
    J'aurais donc 4 éléménts différents (un A, un B, et deux null)

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT COUNT(DISTINCT Champ)
    FROM la_table
    WHERE Champ IS NOT NULL
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    849
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 849
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT COUNT(DISTINCT Champ)
    FROM la_table
    WHERE Champ IS NOT NULL
    Ca ne marche pas, car il faut compter aussi les null

    J'ai trouvé cette méthode:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT COUNT(DISTINCT COALESCE(champs, id))
    FROM la_table

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Je ne pense pas que ce soit ce qui est demandé.
    L'idée c'est de convertir les nulls en une valeur unique, par exemple votre id.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    With MaTable (id, nom) AS
    (
    select 1, 'A'  union all
    select 2, null union all
    select 3, 'A'  union all
    select 4, null union all
    select 5, 'B'
    )
    select count(distinct coalesce(nom, cast(id as varchar)))
      from MaTable;
     
    4
    Edit : vous avez trouvé entre temps, bravo !

  5. #5
    J1
    J1 est déconnecté
    Membre expérimenté Avatar de J1
    Inscrit en
    Mai 2004
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 321
    Par défaut
    Bonsoir,

    l'idée de remplacer les NULL par l'id de la ligne est ingénieuse, mais risquée si la colonne champs peut elle-même valoir 1, 2, 3, etc.
    Pour s'en convaincre, on testera cette méthode sur le jeu de données suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    id    champs
    1     NULL
    2     1
    3     A
    4     NULL
    Le résultat attendu est 4, le résultat obtenu est 3.

    Une méthode moins subtile mais aussi moins risquée consisterait à procéder ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT 	COUNT(*) + (SELECT COUNT(*) FROM T WHERE CHAMPS IS NULL) AS NB
    FROM (	SELECT DISTINCT CHAMPS 
    		FROM T 
    		WHERE CHAMPS IS NOT NULL) X;
    On dénombre les valeurs distinctes non-NULL de la colonne champs et on ajoute à ce nombre le nombre de lignes pour lesquelles champs est NULL.

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    La même idée en plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    WITH MaTable (id, nom) AS
    (
    SELECT 1, NULL union ALL
    SELECT 2, '1'  union ALL
    SELECT 3, 'A'  union ALL
    SELECT 4, NULL
    )
    SELECT count(DISTINCT nom) + count(case when nom is null then 1 end)
      FROM MaTable;
     
    4

  7. #7
    J1
    J1 est déconnecté
    Membre expérimenté Avatar de J1
    Inscrit en
    Mai 2004
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 321
    Par défaut
    Jolie optimisation, Waldar ! Ou comment exploiter au mieux le comportement des fonctions d'agrégation vis à vis de NULL !
    J'oserais même une petite variante, qui s'affranchit du CASE et permet de faire le tour des possibilités offertes par la fonction COUNT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT COUNT(DISTINCT nom) + COUNT(*) - COUNT(nom)
    FROM MaTable;
    Bon week-end !

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

Discussions similaires

  1. [XL-2003] Probleme de comptage en vba
    Par Marc31 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/06/2012, 12h34
  2. [XL-2007] probleme de comptage avec des chaines de caractères
    Par souad12 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 02/05/2011, 08h28
  3. [AC-2000] Probleme de comptage
    Par Slici dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 07/05/2009, 14h38
  4. Probleme de comptage dans une fonction
    Par kev484 dans le forum Débuter
    Réponses: 4
    Dernier message: 18/09/2008, 12h57
  5. [SQL] Probleme de comptage distinct des lignes
    Par shagun dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 27/04/2007, 16h38

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