Saya baru saja mendapatkan diri saya sedikit terjebak dengan beberapa SQL. Saya rasa saya tidak bisa mengungkapkan pertanyaan itu dengan cemerlang - jadi saya tunjukkan.
Saya memiliki dua meja, satu disebut orang, satu disebut janji temu. Saya mencoba mengembalikan jumlah janji temu yang dimiliki seseorang (termasuk jika mereka nol). Perjanjian berisi person_id
dan ada person_id
perjanjian per. Begitu COUNT(person_id)
pula 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 temu yang dimiliki person_id. Namun, orang yang memiliki 0 janji temu tidak dikembalikan (jelas karena mereka tidak ada di tabel itu).
Mengubah pernyataan untuk mengambil person_id dari tabel person 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 tetap hanya akan mengembalikan person_id yang memiliki janji dan bukan yang saya inginkan yang merupakan pengembalian dengan orang yang memiliki 0 janji!
Ada saran, tolong?
sumber
Jawaban:
Anda ingin gabungan luar untuk ini (dan Anda perlu menggunakan orang sebagai tabel "mengemudi")
Alasan mengapa ini berhasil, adalah bahwa gabungan luar (kiri) akan kembali
NULL
untuk orang-orang yang tidak memiliki janji. Fungsi agregatcount()
tidak akan menghitungNULL
nilai dan dengan demikian Anda akan mendapatkan nol.Jika Anda ingin mempelajari lebih lanjut tentang gabungan luar, berikut adalah tutorial yang bagus: http://sqlzoo.net/wiki/Using_Null
sumber
Anda harus menggunakan
LEFT JOIN
bukannyaINNER JOIN
sumber
jika Anda melakukan gabungan luar (dengan hitungan), dan kemudian menggunakan hasil ini sebagai sub-tabel, Anda bisa mendapatkan 0 seperti yang diharapkan (berkat fungsi nvl)
Ex:
sumber
GUNAKAN bergabung untuk mendapatkan 0 hitungan dalam hasil menggunakan GROUP BY.
cukup 'join' apakah Inner join di MS SQL jadi, Pergi untuk join kiri atau kanan.
Jika tabel yang berisi kunci utama disebutkan pertama di QUERY, maka gunakan Gabung KIRI lain Gabung KANAN.
MISALNYA:
.
Ambil kelompok berdasarkan dari tabel yang memiliki kunci Primer dan hitung dari tabel lain yang memiliki entri / detail aktual.
sumber
Untuk mengubah lebih sedikit pada kueri asli Anda, Anda dapat mengubah gabungan Anda menjadi
RIGHT
gabunganIni hanya dibangun di atas jawaban yang dipilih, tetapi karena gabungan luar
RIGHT
searah, hanya satu kata yang perlu ditambahkan dan sedikit perubahan. - Ingatlah bahwa itu ada di sana dan terkadang membuat kueri lebih mudah dibaca dan membutuhkan lebih sedikit pembangunan kembali.sumber
Masalah dengan LEFT JOIN adalah jika tidak ada janji temu, masih akan mengembalikan satu baris dengan nol, yang bila digabungkan dengan JUMLAH akan menjadi 1, dan akan tampak bahwa orang tersebut memiliki satu janji temu padahal sebenarnya mereka tidak punya janji. Saya pikir ini akan memberikan hasil yang benar:
sumber