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 actif
    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
    Points : 295
    Points
    295
    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
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 046
    Points
    34 046
    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. Autoentrepreneur.
    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 actif
    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
    Points : 295
    Points
    295
    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 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 383
    Points
    18 383
    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 averti Avatar de J1
    Inscrit en
    Mai 2004
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 321
    Points : 335
    Points
    335
    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 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 383
    Points
    18 383
    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 averti Avatar de J1
    Inscrit en
    Mai 2004
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 321
    Points : 335
    Points
    335
    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