SQLShack (Français)

Cet article explore l’opérateur SQL Count Distinct pour éliminer les lignes dupliquées dans le jeu de résultats.

Un développeur a besoin d’obtenir des données d’une table SQL avec plusieurs conditions. Parfois, nous voulons obtenir toutes les lignes d’une table mais éliminer les valeurs NULL disponibles. Supposons que nous souhaitons obtenir des enregistrements clients distincts qui ont passé une commande l’année dernière.

Allons-y et avons un bref aperçu de la fonction de décompte SQL.

Fonction de décompte SQL

Nous utilisons la fonction d’agrégation SQL Count pour obtenir le nombre de lignes dans le résultat. Supposons que nous ayons une table de produits contenant des enregistrements pour tous les produits vendus par une entreprise. Nous voulons connaître le nombre de produits vendus au cours du dernier trimestre. Nous pouvons utiliser la fonction SQL Count pour renvoyer le nombre de lignes dans la condition spécifiée.

La syntaxe de la fonction SQL COUNT:
COUNT (expression);

Par défaut, La fonction de décompte de SQL Server utilise le mot clé All. Cela signifie que SQL Server compte tous les enregistrements d’une table. Il inclut également les lignes ayant des valeurs en double.

Créons un exemple de table et insérons quelques enregistrements dedans.

Dans cette table, nous avons également des valeurs en double et des valeurs NULL .

Dans la capture d’écran suivante, nous pouvons noter que:

  • Count (* ) inclut les valeurs en double ainsi que les valeurs NULL
  • Count (Col1) inclut les valeurs en double mais n’inclut pas les valeurs NULL

Supposons que nous voulions connaître les valeurs distinctes disponibles dans le tableau. Nous pouvons utiliser SQL COUNT DISTINCT pour ce faire.

1
2

Sélectionnez le nombre (DISTINCT COL1)
dans ## TestTable

Dans la sortie suivante, nous n’obtenons que 2 lignes. SQL COUNT Distinct n’élimine pas les doublons et les valeurs NULL de l’ensemble de résultats.

Prenons un autre exemple. Dans cet exemple, nous avons une table de localisation qui se compose de deux colonnes City et State.

Maintenant, exécutez la requête suivante pour trouver un décompte de la ville distincte de la table.

1
2

SELECT COUNT (DISTINCT (Ville))
FROM Location;

Il renvoie le nombre de villes uniques comptées 2 (Gurgaon et Jaipur) de notre ensemble de résultats.

Si nous regardons les données, nous avons un nom de ville similaire présent dans un autre État aussi. La combinaison de la ville et de l’état est unique, et nous ne voulons pas que cette combinaison unique soit éliminée de la sortie.

Nous pouvons également utiliser la fonction SQL DISTINCT sur une combinaison de colonnes. Il vérifie la combinaison de valeurs et supprime si la combinaison n’est pas unique.

1
2

SELECT DISTINCT Ville, État
FROM Emplacement;

Cela ne supprime pas les noms de ville en double de la sortie en raison d’une combinaison unique de valeurs.

Insérons encore une ligne dans le tableau des emplacements.

1

Insérer dans les valeurs de localisation (« Gurgaon « , » Haryana « )

Nous avons 5 enregistrements dans la table de localisation. Dans les données, vous pouvez voir que nous avons une combinaison de ville et d’état qui n’est pas unique.

Relancez SELECT DISTINCT et elle ne devrait renvoyer que 4 lignes cette fois.

Nous ne pouvons pas utiliser la fonction SQL COUNT DISTINCT directement avec les multiples colonnes . Le message d’erreur suivant s’affiche.

Nous pouvons utiliser une table temporaire pour obtenir des enregistrements de la fonction SQL DISTINCT, puis utiliser count (*) pour vérifier le nombre de lignes.

1
2
3
4

SELECT DISTINCT Ville, État
en #Temp
FROM Emplacement;
Sélectionnez le nombre (*) de #Temp

Nous obtenons le nombre de lignes 4 dans la sortie.

Si nous utilisons une combinaison de colonnes pour être distinct valeurs et l’une des colonnes contient des valeurs NULL, cela devient également une combinaison unique pour le serveur SQL.

Pour vérifier cela, insérons plus d’enregistrements dans la table de localisation. Nous n’avons spécifié aucun état dans cette requête.

1
2

Insérer dans les valeurs de localisation (« Gurgaon », «  »)
Insérer dans les valeurs de localisation (ville) (« Gurgaon »)

Regardons les données de la table de localisation.

Relancez la requête pour être distinct lignes de la table de localisation.

1
2

SELECT distinct ville, état
FROM Emplacement;

Dans la sortie, nous pouvons voir qu’il n’élimine pas la combinaison de la ville et de l’état avec les valeurs vides ou NULL.

De même, vous pouvez voir le nombre de lignes 6 avec SQL COUNT Fonction DISTINCT.

Différence entre SELECT COUNT, COUNT (*) et SQL COUNT distinct

COUNT

Count (*)

Count (Distinct)

Il renvoie le nombre total de lignes après avoir satisfait aux conditions spécifiées dans la clause where.

Il renvoie le nombre total de lignes après avoir satisfait aux conditions spécifiées dans la clause where.

Il renvoie le nombre distinct de lignes après avoir satisfait aux conditions spécifiées dans la clause where .

Il donne le nombre de lignes. Il n’élimine pas les valeurs en double.

Il considère toutes les lignes indépendamment de toute valeur NULL en double.

Il donne un nombre distinct de lignes après avoir éliminé NULL et les valeurs en double.

Il élimine les valeurs NULL dans la sortie.

Cela n’élimine pas les valeurs NULL dans la sortie.

Il élimine les valeurs NULL dans la sortie.

Fonction distincte du plan d’exécution de SQL Count

Regardons le plan d’exécution réel de la fonction SQL COUNT DISTINCT. Vous devez activer le plan d’exécution réel à partir de la barre de menu SSMS comme indiqué ci-dessous.

Exécutez la requête pour obtenir un réel plan d’exécution. Dans ce plan d’exécution, vous pouvez voir les principaux opérateurs consommateurs de ressources:

  • Trier (tri distinct) – Coût 78%
  • Analyse de table – Coût 22%

Vous pouvez passer la souris sur l’opérateur de tri, et il ouvre une info-bulle avec les détails de l’opérateur.

Dans les fenêtres de propriétés, nous obtenons également plus de détails sur l’opérateur de tri, y compris l’allocation de mémoire, les statistiques et le nombre de lignes.

/ p>

Dans une table contenant un million d’enregistrements, SQL Count Distinct peut entraîner des problèmes de performances car un opérateur de comptage distinct est un opérateur coûteux dans le plan d’exécution réel.

SQL Server 2019 améliore les performances de l’opérateur SQL COUNT DISTINCT à l’aide d’une nouvelle fonction Approx_count_distinct. Cette nouvelle fonction de SQL Server 2019 fournit un nombre distinct approximatif des lignes. Il peut y avoir une légère différence dans la sortie de la fonction SQL Count distinct et Approx_Count_distinct.

Vous pouvez remplacer SQL COUNT DISTINCT par le mot clé Approx_Count_distinct pour utiliser cette fonction à partir de SQL Server 2019.

1
2

SELECT APPROX_COUNT_DISTINCT (ville)
FROM Location;

Vous pouvez en savoir plus sur cette fonction dans La nouvelle fonction SQL Server 2019 Approx_Count_Distinct.

Conclusion

Dans cet article, nous avons exploré la fonction SQL COUNT avec divers exemples. Nous avons également couvert la nouvelle fonction SQL Approx_Count_distinct disponible à partir de SQL Server 2019. Je suggérerais de les examiner en fonction de votre environnement. Si vous avez des commentaires ou des questions, n’hésitez pas à les laisser dans les commentaires ci-dessous.

  • Auteur
  • Messages récents
En tant que formateur certifié MCSA et Microsoft Certified à Gurgaon, en Inde, avec 13 ans d’expérience, Rajendra travaille pour une variété de grandes entreprises se concentrant sur l’optimisation des performances, la surveillance et la haute disponibilité et stratégies de reprise après sinistre et mise en œuvre. Il est l’auteur de centaines d’articles faisant autorité sur SQL Server, Azure, MySQL, Linux, Power BI, le réglage des performances, AWS / Amazon RDS, Git et les technologies associées qui ont été consultés par plus de 10 millions de lecteurs à ce jour.
Il est le créateur de l’une des plus grandes collections d’articles en ligne gratuits sur un seul sujet, avec sa série de 50 articles sur les groupes de disponibilité SQL Server Always On. Sur la base de sa contribution à la communauté SQL Server, il a été récompensé par divers prix dont le prestigieux « Meilleur auteur de l’année » en continu en 2020 et 2021 chez SQLShack.
Raj est toujours intéressé par de nouveaux défis, donc si vous avez besoin de conseil aide sur tout sujet traité dans ses écrits, il peut être contacté à [email protected]
Voir tous les articles de Rajendra Gupta

Derniers articles de Rajendra Gupta (voir tout)
  • Délais d’expiration des sessions dans SQL Server Always On Availability Groupes – 8 février 2021
  • Mise à niveau des versions mineures et majeures pour AWS RDS SQL Server – 29 janvier 2021
  • Déploiement d’instances AWS RDS PostgreSQL – 27 janvier 2021

Write a Comment

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *