Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

SQL Count untuk memasukkan nilai nol

Bukan klausa WHERE, tetapi GROUP BY. Kueri hanya akan mengembalikan data untuk baris yang ada. Itu berarti ketika Anda mengelompokkan berdasarkan tanggal stempel waktu, hanya hari-hari di mana ada baris yang akan dikembalikan. SQL Server tidak dapat mengetahui dari konteks bahwa Anda ingin "mengisi bagian yang kosong", dan tidak tahu dengan apa.

Jawaban normalnya adalah CTE yang menghasilkan semua hari yang ingin Anda lihat, sehingga mengisi bagian yang kosong. Yang ini sedikit rumit karena memerlukan pernyataan SQL rekursif, tetapi ini adalah trik yang terkenal:

WITH CTE_Dates AS
(
    SELECT @START AS cte_date
    UNION ALL
    SELECT DATEADD(DAY, 1, cte_date)
    FROM CTE_Dates
    WHERE DATEADD(DAY, 1, cte_date) <= @END
)
SELECT
cte_date as TIME_STAMP,
ISNULL(COUNT(HL_Logs.Time_Stamp), 0) AS counted_leads, 
FROM CTE_Dates
LEFT JOIN HL_Logs ON DATEADD(dd, 0, DATEDIFF(dd, 0, Time_Stamp)) = cte_date
WHERE Time_Stamp between @BEGIN and @END and ID_Location = @LOCATION
GROUP BY cte_date

Memecahnya, CTE menggunakan gabungan yang mereferensikan dirinya sendiri untuk secara rekursif menambahkan satu hari pada satu waktu ke tanggal sebelumnya dan mengingat tanggal itu sebagai bagian dari tabel. Jika Anda menjalankan pernyataan sederhana yang menggunakan CTE dan hanya memilih * darinya, Anda akan melihat daftar tanggal antara awal dan akhir. Kemudian, pernyataan tersebut menggabungkan daftar tanggal ini ke tabel log berdasarkan tanggal stempel waktu log, sambil mempertahankan tanggal yang tidak memiliki entri log menggunakan gabungan kiri (mengambil semua baris dari sisi "kiri" apakah mereka memiliki baris yang cocok di " kanan" atau tidak). Akhirnya, kami mengelompokkan berdasarkan tanggal dan menghitung dan kami akan mendapatkan jawaban yang Anda inginkan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bidang stempel tanggal waktu pembaruan otomatis SQL Server

  2. SQL Server 2005/2008 - beberapa grup file?

  3. Mengonfigurasi Grup Ketersediaan AlwaysOn - Bagian 2

  4. Bagaimana cara mendapatkan skrip data SQL Server?

  5. SQL Server 2008:TOP 10 dan berbeda bersama-sama