Saya memiliki kueri yang mengembalikan rata-rata (harga)
select avg(price)
from(
select *, cume_dist() OVER (ORDER BY price desc) from web_price_scan
where listing_Type='AARM'
and u_kbalikepartnumbers_id = 1000307
and (EXTRACT(Day FROM (Now()-dateEnded)))*24 < 48
and price>( select avg(price)* 0.50
from(select *, cume_dist() OVER (ORDER BY price desc)
from web_price_scan
where listing_Type='AARM'
and u_kbalikepartnumbers_id = 1000307
and (EXTRACT(Day FROM (Now()-dateEnded)))*24 < 48
)g
where cume_dist < 0.50
)
and price<( select avg(price)*2
from( select *, cume_dist() OVER (ORDER BY price desc)
from web_price_scan
where listing_Type='AARM'
and u_kbalikepartnumbers_id = 1000307
and (EXTRACT(Day FROM (Now()-dateEnded)))*24 < 48
)d
where cume_dist < 0.50)
)s
having count(*) > 5
bagaimana membuatnya kembali 0 jika tidak ada nilai yang tersedia?
sql
postgresql
Andrew
sumber
sumber
from web_price_scan
adalah pilihan terpisah; tidak yakin apa masalahnya di sini?having
klausa tanpagroup by
(yang defaultnya ke satu grup). Ini bertindak sebagaiwhere
klausul pada hasil agregat. Dalam kasus ini, baris hanya dikembalikan jika lebih dari 5 baris dikembalikan oleh subkueri tingkat 1.Jawaban:
gunakan coalesce
Edit
Berikut adalah contoh
COALESCE
dengan kueri Anda:IMHO
COALESCE
tidak boleh digunakan denganAVG
karena mengubah nilainya.NULL
berarti tidak diketahui dan tidak ada yang lain. Ini tidak seperti menggunakannya dalamSUM
. Dalam contoh ini, jika kita menggantiAVG
denganSUM
, hasilnya tidak terdistorsi. Menambahkan 0 ke jumlah tidak merugikan siapa pun, tetapi menghitung rata-rata dengan 0 untuk nilai yang tidak diketahui, Anda tidak akan mendapatkan rata-rata sebenarnya.Dalam hal ini, saya akan menambahkan
price IS NOT NULL
diWHERE
klausul untuk menghindari nilai-nilai yang tidak diketahui tersebut.sumber
from web_price_scan...
tampaknya diulang ...NULLIF(v1, v2)
apakah kebalikan dariCOALESCE
itu mengembalikanNULL
jikav1
samav2
.(jawaban ini ditambahkan untuk memberikan contoh yang lebih singkat dan lebih umum untuk pertanyaan - tanpa menyertakan semua detail khusus kasus di pertanyaan asli).
Ada dua "masalah" yang berbeda di sini, yang pertama adalah jika tabel atau subkueri tidak memiliki baris, yang kedua adalah jika ada nilai NULL dalam kueri.
Untuk semua versi yang saya uji, postgres dan mysql akan mengabaikan semua nilai NULL saat rata-rata, dan akan mengembalikan NULL jika tidak ada yang rata-rata di atas. Ini umumnya masuk akal, karena NULL dianggap "tidak diketahui". Jika Anda ingin menimpanya, Anda dapat menggunakan penggabungan (seperti yang disarankan oleh Luc M).
tentu saja, "dari foo" dapat diganti dengan "dari (... logika rumit apa pun di sini ...) sebagai foo"
Sekarang, haruskah baris NULL dalam tabel dihitung sebagai 0? Kemudian penggabungan harus digunakan di dalam panggilan rata-rata.
sumber
Saya dapat memikirkan 2 cara untuk mencapai ini:
IFNULL ():
Fungsi IFNULL () mengembalikan nilai yang ditentukan jika ekspresi NULL. Jika ekspresi NOT NULL, fungsi ini mengembalikan ekspresi.
Sintaksis:
Contoh IFNULL () dengan kueri Anda:
BERSATU()
Fungsi COALESCE () mengembalikan nilai bukan nol pertama dalam daftar.
Sintaksis:
Contoh COALESCE () dengan kueri Anda:
sumber