COUNT DISTINCT dengan CONDITIONS

104

Saya ingin menghitung jumlah item berbeda dalam kolom yang tunduk pada kondisi tertentu, misalnya jika tabelnya seperti ini:

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

Jika saya ingin menghitung jumlah tag berbeda sebagai "jumlah tag" dan menghitung jumlah tag berbeda dengan id entri> 0 sebagai "jumlah tag positif" dalam tabel yang sama, apa yang harus saya lakukan?

Saya sekarang menghitung dari dua tabel berbeda di mana pada tabel kedua saya hanya memilih baris tersebut dengan entryID lebih besar dari nol. Saya pikir harus ada cara yang lebih kompak untuk mengatasi masalah ini.

derekhh
sumber

Jawaban:

258

Anda bisa mencoba ini:

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

Yang pertama count(distinct...)mudah. Yang kedua, terlihat agak rumit, sebenarnya sama dengan yang pertama, hanya saja Anda menggunakan case...whenklausa. Dalam case...whenklausa, Anda hanya memfilter nilai positif. Nol atau nilai negatif akan dievaluasi sebagai nulldan tidak akan disertakan dalam hitungan.

Satu hal yang perlu diperhatikan di sini adalah ini dapat dilakukan dengan membaca tabel satu kali. Ketika tampaknya Anda harus membaca tabel yang sama dua kali atau lebih, itu sebenarnya dapat dilakukan dengan membaca sekali, di sebagian besar waktu. Hasilnya, ini akan menyelesaikan tugas jauh lebih cepat dengan I / O yang lebih sedikit.

ntalbs.dll
sumber
2
Tetapi apakah positive_tag_count akan berbeda juga?
derekhh
Kueri yang diedit masih tidak menyelesaikan masalah - bukankah ini sekarang bekerja pada nilai entryId yang berbeda daripada tag yang berbeda?
BrianC
Ini solusi yang sangat cerdas.
Luc
Saya memiliki beberapa kolom dalam perbedaan saya (jumlah contoh (tag berbeda, tanggal)). Apakah ada cara untuk memiliki beberapa kolom di klausa kemudian. Jika saya hanya melakukan tag, tanggal itu melempar pengecualian parse
Crusaderpyro
@Crusaderpyro Itu di luar cakupan pertanyaan asli. Saya akan membuat pertanyaan baru untuk itu.
ntalbs
2

Coba pernyataan berikut:

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]

Bidang pertama akan menjadi tag, yang kedua akan menjadi hitungan keseluruhan, yang ketiga akan menjadi hitungan positif.

MJBLACKEND
sumber
1

Ini mungkin berhasil:

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

dan

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

Ini mungkin juga berhasil:

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

Anda memerlukan kondisi entryID di left join daripada di klausa where untuk memastikan bahwa setiap item yang hanya memiliki entryID 0 dihitung dengan benar di DISTINCT pertama.

BrianC
sumber
1
Kueri ini membaca tabel dua kali. Itu bisa dilakukan dengan membaca tabel hanya sekali.
ntalbs
0

Kode menghitung kombinasi unik / berbeda dari Tag & ID Entri ketika [Id Entri]> 0

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

Dalam output itu akan menampilkan hitungan nilai unik Semoga ini bisa membantu

Abhishek Gupta
sumber