Anda sedang mencari cara untuk mendapatkan semua hari yang terdaftar, bahkan hari-hari yang tidak terwakili dalam customer
Anda meja. Ini adalah rasa sakit yang terkenal di leher dalam SQL. Itu karena dalam bentuknya yang murni SQL tidak memiliki konsep urutan yang bersebelahan dari apa pun ... nomor kardinal, hari, apa pun.
Jadi, Anda perlu memperkenalkan tabel yang berisi sumber nomor kardinal yang berdekatan, atau tanggal, atau sesuatu, lalu LEFT JOIN data Anda yang sudah ada ke tabel itu.
Ada beberapa cara untuk melakukannya. Salah satunya adalah membuat sendiri calendar
tabel dengan baris untuk setiap hari dalam dekade atau abad ini atau apa pun, lalu gabungkan dengannya. (Tabel itu tidak akan terlalu besar dibandingkan dengan kemampuan database modern.
Katakanlah Anda memiliki tabel itu, dan memiliki kolom bernama date
. Maka Anda akan melakukan ini.
SELECT calendar.date AS created,
ISNULL(a.customer_count, 0) AS customer_count
FROM calendar
LEFT JOIN (
SELECT COUNT(*) AS customer_count,
DATE(created) AS created
FROM customer
GROUP BY DATE(created)
) a ON calendar.date = a.created
WHERE calendar.date BETWEEN start AND finish
ORDER BY calendar.date
Perhatikan beberapa hal. Pertama, LEFT JOIN
dari tabel kalender ke kumpulan data Anda. Jika Anda menggunakan JOIN
biasa data yang hilang dalam kumpulan data Anda akan menyembunyikan baris dari kalender.
Kedua, ISNULL
di SELECT
tingkat atas untuk mengubah nilai yang hilang, nol, dari kumpulan data Anda menjadi nilai nol.
Sekarang, Anda bertanya, di mana saya bisa mendapatkan meja kalender itu? Saya dengan hormat menyarankan Anda untuk mencari tahu, dan mengajukan pertanyaan lain jika Anda tidak dapat memahaminya.
Saya menulis sedikit esai tentang ini, yang dapat Anda temukan di sini.http://www.plumislandmedia.net/mysql/filling-missing-data-sequences-cardinal-integers/