Pertanyaan Bagaimana cara memasukkan hasil “nol” / “0” dalam COUNT agregat?


Saya baru saja mendapati diri saya sedikit terjebak dengan beberapa SQL. Saya tidak berpikir saya bisa mengutarakan pertanyaan dengan cemerlang - jadi saya akan menunjukkannya kepada Anda.

Saya memiliki dua meja, yang disebut orang, yang disebut janji. Saya mencoba mengembalikan jumlah janji yang dimiliki seseorang (termasuk jika mereka memiliki nol). Penunjukan berisi person_id dan ada a person_id per janji temu. Begitu COUNT(person_id) adalah pendekatan yang masuk akal.

Kueri:

SELECT person_id, COUNT(person_id) AS "number_of_appointments" 
FROM appointment 
GROUP BY person_id;

Akan kembali dengan benar, jumlah janji yang dimiliki seseorang_id. Namun, seseorang yang memiliki 0 janji tidak dikembalikan (jelas karena mereka tidak ada di meja itu).

Tweaking pernyataan untuk mengambil orang_id dari tabel orang memberi saya sesuatu seperti:

SELECT person.person_id, COUNT(appointment.person_id) AS "number_of_appointments"
FROM appointment
JOIN person ON person.person_id = appointment.person_id
GROUP BY person.person_id;

Namun, ini hanya akan mengembalikan seseorang_d yang memiliki janji dan bukan yang saya inginkan yang kembali dengan orang yang memiliki 0 janji temu!

Ada saran?


76
2018-02-09 23:59


asal


Jawaban:


Anda ingin bergabung di luar untuk ini (dan Anda perlu menggunakan orang sebagai tabel "mengemudi")

SELECT person.person_id, COUNT(appointment.person_id) AS "number_of_appointments"
FROM person 
  LEFT JOIN appointment ON person.person_id = appointment.person_id
GROUP BY person.person_id;

Alasan mengapa ini berfungsi, adalah bahwa gabungan luar (kiri) akan kembali NULL untuk orang-orang yang tidak memiliki janji. Fungsi agregat count() tidak akan dihitung NULL nilai-nilai dan dengan demikian Anda akan mendapatkan nol.

Jika Anda ingin mempelajari lebih lanjut tentang gabungan luar, berikut tutorial yang bagus: http://sqlzoo.net/wiki/Using_Null


67
2018-02-10 00:04



Anda harus menggunakannya LEFT JOIN dari pada INNER JOIN

SELECT person.person_id, COUNT(appointment.person_id) AS "number_of_appointments"
FROM person 
LEFT JOIN appointment ON person.person_id = appointment.person_id
GROUP BY person.person_id;

17
2018-02-10 00:03



jika Anda melakukan penggabungan luar (dengan hitungan), dan kemudian menggunakan hasil ini sebagai sub-tabel, Anda bisa mendapatkan 0 seperti yang diharapkan (berkat fungsi nvl)

Ex:

select P.person_id, nvl(A.nb_apptmts, 0) from 
(SELECT person.person_id
FROM person) P
LEFT JOIN 
(select person_id, count(*) as nb_apptmts
from appointment 
group by person_id) A
ON P.person_id = A.person_id

4
2018-01-20 13:30



GUNAKAN bergabung untuk mendapatkan 0 hitungan dalam hasil menggunakan GROUP BY.

cukup 'join' saja Inner join di MS SQL jadi, Go untuk kiri atau kanan gabung.

Jika tabel yang berisi kunci primer disebutkan pertama di QUERY kemudian gunakan KIRI bergabung dengan yang lain KANAN bergabung.

MISALNYA:

select WARDNO,count(WARDCODE) from MAIPADH 
right join  MSWARDH on MSWARDH.WARDNO= MAIPADH.WARDCODE
group by WARDNO

.

select WARDNO,count(WARDCODE) from MSWARDH
left join  MAIPADH on MSWARDH.WARDNO= MAIPADH.WARDCODE group by WARDNO

Ambil kelompok dari tabel yang memiliki kunci Utama dan hitung dari tabel lain yang memiliki entri / detail yang sebenarnya.


2
2017-11-09 10:55



Untuk mengubah bahkan lebih sedikit pada permintaan asli Anda, Anda dapat mengubah Anda bergabung menjadi RIGHT ikut

SELECT person.person_id, COUNT(appointment.person_id) AS "number_of_appointments"
FROM appointment
RIGHT JOIN person ON person.person_id = appointment.person_id
GROUP BY person.person_id;

Ini hanya dibangun di atas jawaban yang dipilih, tetapi sebagai bergabung luar ada di RIGHT arah, hanya satu kata yang perlu ditambahkan dan sedikit perubahan. - Ingat saja bahwa itu ada dan terkadang dapat membuat kueri lebih mudah dibaca dan membutuhkan lebih sedikit pembangunan kembali.


0
2018-06-28 12:21