158 votes

COUNT DISTINCT avec CONDITIONS

Je veux compter le nombre d'éléments distincts dans une colonne sous réserve d'une certaine condition, par exemple si la table est comme ceci :

tag | entryID
----+---------
foo | 0
foo | 0
bar | 3

Si je veux compter le nombre de balises distinctes comme "nombre de balises" et compter le nombre de balises distinctes avec une entrée id > 0 comme "nombre de balises positives" dans la même table, que dois-je faire ?

Je compte maintenant à partir de deux tableaux différents où, dans le second tableau, je n'ai sélectionné que les lignes dont l'ID d'entrée est supérieur à zéro. Je pense qu'il devrait y avoir un moyen plus compact de résoudre ce problème.

374voto

ntalbs Points 4583

Vous pouvez essayer ceci :

select
  count(distinct tag) as tag_count,
  count(distinct (case when entryId > 0 then tag end)) as positive_tag_count
from
  your_table_name;

Le premier count(distinct...) est facile. La deuxième, qui semble un peu complexe, est en fait la même que la première, sauf que vous utilisez case...when clause. Dans la case...when vous ne filtrez que les valeurs positives. Les zéros ou les valeurs négatives seraient évalués comme suit null et ne seront pas inclus dans le décompte.

Une chose à noter ici est que cela peut être fait en lisant le tableau une seule fois. Lorsqu'il semble que vous devez lire le même tableau deux fois ou plus, vous pouvez en fait le faire en ne le lisant qu'une fois, la plupart du temps. Par conséquent, la tâche sera accomplie beaucoup plus rapidement avec moins d'entrées/sorties.

2voto

zaz Points 425

Cela peut marcher :

SELECT Count(tag) AS 'Tag Count'
FROM Table
GROUP BY tag

y

SELECT Count(tag) AS 'Negative Tag Count'
FROM Table
WHERE entryID > 0
GROUP BY tag

2voto

MJBLACKEND Points 91

Essayez l'affirmation suivante :

select  distinct A.[Tag],
     count(A.[Tag]) as TAG_COUNT,
     (SELECT count(*) FROM [TagTbl] AS B WHERE A.[Tag]=B.[Tag] AND B.[ID]>0)
     from [TagTbl] AS A GROUP BY A.[Tag]

Le premier champ sera l'étiquette, le deuxième sera le compte total et le troisième sera le compte des positifs.

2voto

Abhishek Gupta Points 11

Le code compte la combinaison unique/distincte de l'étiquette et de l'ID d'entrée lorsque [ID d'entrée]>0.

select count(distinct(concat(tag,entryId)))
from customers
where id>0

Dans la sortie, il affichera le nombre de valeurs uniques. J'espère que cela vous aidera

2voto

Ukpa Uchechi Points 346

Je suis d'accord avec la solution de @ntalbs, si vous voulez compter les données d'une colonne lorsque la condition des données d'une autre colonne est valide, vous pouvez faire ceci

select
  count(distinct tag) as tag_count,
  count(distinct tag, case when entryId > 0 then tag end) as positive_tag_count
from
  your_table_name;

À la ligne 3, j'ai ajouté le nom de la colonne à côté de l'élément distinct Ainsi, il comptera les étiquettes distinctes lorsque l'entryId est supérieur à 0.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X