Saya sedang membangun kueri dengan GROUP BY
klausa yang membutuhkan kemampuan untuk menghitung catatan hanya berdasarkan kondisi tertentu (misalnya menghitung hanya catatan di mana nilai kolom tertentu sama dengan 1).
SELECT UID,
COUNT(UID) AS TotalRecords,
SUM(ContractDollars) AS ContractDollars,
(COUNTIF(MyColumn, 1) / COUNT(UID) * 100) -- Get the average of all records that are 1
FROM dbo.AD_CurrentView
GROUP BY UID
HAVING SUM(ContractDollars) >= 500000
The COUNTIF()
garis jelas gagal karena tidak ada fungsi SQL asli disebut COUNTIF
, tapi ide di sini adalah untuk menentukan persentase semua baris yang memiliki nilai '1' untuk MyColumn.
Adakah pemikiran tentang bagaimana menerapkan ini dengan benar di lingkungan MS SQL 2005?
sql
sql-server-2005
senfo
sumber
sumber
ISNULL
, sebaliknya Anda dapat melakukannyaCASE WHEN myColumn IS NULL
, atau menggunakanifnull
( stackoverflow.com/a/799406/1861346 )Saya biasanya melakukan apa yang direkomendasikan Josh, tetapi melakukan brainstorming dan menguji alternatif yang agak tipu yang ingin saya bagikan.
Anda dapat memanfaatkan fakta bahwa COUNT (ColumnName) tidak menghitung NULL, dan menggunakan sesuatu seperti ini:
NULLIF - mengembalikan NULL jika kedua nilai yang diteruskan sama.
Keuntungan: Mengungkapkan maksud Anda ke COUNT baris alih-alih memiliki notasi SUM (). Kerugian: Tidak jelas bagaimana cara kerjanya ("sihir" biasanya buruk).
sumber
ISNULL
sebagai berikut:SELECT COUNT(NULLIF(0, ISNULL(myColumn, 0)))
. Tunggu, itu hanya terlihat jelek ...Saya akan menggunakan sintaks ini. Ini mencapai hal yang sama seperti saran Josh dan Chris, tetapi dengan keuntungan itu sesuai dengan ANSI dan tidak terikat dengan vendor database tertentu.
sumber
NULLIF
termasuk Standard SQL-92). Jawabannya Josh dapat dengan mudah diubah menjadi Standar SQL dengan menggantiisnull
denganCOALESCE
.=
. Saya menggunakannya untuk "menghitung jumlah tanggapan> = 2".Menambahkan ke jawaban Josh,
Bekerja dengan baik untuk saya (dalam SQL Server 2012) tanpa mengubah 'hitung' menjadi 'jumlah' dan logika yang sama portabel untuk 'agregat kondisional' lainnya. Misalnya, penjumlahan berdasarkan suatu kondisi:
sumber
Bagaimana tentang
Lebih pendek dari
CASE
:)Berfungsi karena
COUNT()
tidak menghitung nilai nol, danIF
/CASE
mengembalikan nol ketika kondisi tidak terpenuhi dan tidak adaELSE
.Saya pikir ini lebih baik daripada menggunakan
SUM()
.sumber
Tidak spesifik produk, tetapi standar SQL menyediakan
SELECT COUNT() FILTER WHERE <condition-1>, COUNT() FILTER WHERE <condition-2>, ... FROM ...
untuk tujuan ini. Atau sesuatu yang sangat mirip, saya tidak tahu dari atas topiku.
Dan tentu saja vendor akan lebih memilih untuk tetap dengan solusi eksklusif mereka.
sumber
FILTER
klausa adalah PostgreSQL, tetapi ditiru olehCASE
semuanya.Kenapa tidak seperti ini?
sumber
Saya harus menggunakan COUNTIF () dalam kasus saya sebagai bagian dari kolom SELECT saya DAN untuk meniru% dari berapa kali setiap item muncul di hasil saya.
Jadi saya menggunakan ini ...
Tentu saja Anda perlu memformat hasilnya sesuai dengan kebutuhan tampilan Anda.
sumber
sumber