COUNT DISTINCT with CONDITIONS


107

Belirli bir koşula tabi olarak bir sütundaki farklı öğelerin sayısını saymak istiyorum, örneğin tablo şöyle ise:

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

Farklı etiketlerin sayısını "etiket sayısı" olarak saymak ve giriş kimliği> 0 olan farklı etiketlerin sayısını aynı tabloda "pozitif etiket sayısı" olarak saymak istersem ne yapmalıyım?

Şimdi, ikinci tabloda yalnızca giriş kimliği sıfırdan büyük olan satırları seçtiğim iki farklı tablodan sayıyorum. Bence bu sorunu çözmenin daha kompakt bir yolu olmalı.

Yanıtlar:


260

Bunu deneyebilirsiniz:

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

Birincisi count(distinct...)kolaydır. İkincisi, biraz karmaşık görünüyor, aslında ilkiyle aynı, ancak case...whentümce kullanman dışında . In case...whenmaddesi, sadece pozitif değerler filtre. Sıfırlar veya negatif değerler olarak değerlendirilir nullve sayıma dahil edilmez.

Burada dikkat edilmesi gereken bir nokta, bunun tabloyu bir kez okuyarak yapılabileceğidir. Aynı tabloyu iki veya daha fazla kez okumanız gerekiyor gibi göründüğünde, aslında çoğu zaman bir kez okuyarak yapılabilir. Sonuç olarak, daha az G / Ç ile görevi çok daha hızlı bitirecektir.


2
Peki Positive_tag_count da farklı olacak mı?
derekhh

Düzenlenen sorgu hala sorunu çözmüyor - bu artık farklı etiketler yerine farklı entryId değerleri üzerinde çalışmıyor mu?
BrianC

Bu gerçekten akıllıca bir çözüm.
Luc,

Farklımda birden çok sütun var (örnek sayı (farklı etiket, tarih)). Then cümlesinde birden çok sütuna sahip olmanın bir yolu var mı? Sadece bir etiket yaparsam, tarih ayrıştırma istisnası atar
Crusaderpyro

@Crusaderpyro Bu, orijinal sorunun kapsamı dışındadır. Bunun için yeni bir soru yaratırdım.
ntalbs

2

Aşağıdaki ifadeyi deneyin:

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]

İlk alan etiket olacak, ikincisi tam sayı olacak, üçüncüsü pozitif olanlar sayılacaktır.


1

Bu işe yarayabilir:

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

ve

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

0

Bu da işe yarayabilir:

SELECT 
    COUNT(DISTINCT T.tag) as DistinctTag,
    COUNT(DISTINCT T2.tag) as DistinctPositiveTag
FROM Table T
    LEFT JOIN Table T2 ON T.tag = T2.tag AND T.entryID = T2.entryID AND T2.entryID > 0

İlk DISTINCT'de yalnızca giriş kimliği 0 olan tüm öğelerin doğru şekilde sayıldığından emin olmak için, bir where cümlesi yerine sol birleşimdeki entryID koşuluna ihtiyacınız vardır.


1
Bu sorgu, tabloyu iki kez okur. Tabloyu yalnızca bir kez okuyarak yapılabilir.
ntalbs

0

Kod, [Giriş Kimliği]> 0 olduğunda Etiket ve Giriş Kimliğinin benzersiz / farklı kombinasyonunu sayar

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

Çıktıda benzersiz değerlerin sayısını gösterecektir Umarım bu yardımcı olur

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.