sql >> Databáze >  >> RDS >> Sqlserver

SQL Počet pro zahrnutí nulových hodnot

Ani ne tak klauzule WHERE, ale GROUP BY. Dotaz vrátí data pouze pro řádky, které existují. To znamená, že když seskupujete podle data časového razítka, vrátí se pouze dny, pro které existují řádky. SQL Server nemůže z kontextu vědět, že chcete „vyplnit prázdná místa“, a nevěděl by ani čím.

Normální odpovědí je CTE, která produkuje všechny dny, které chcete vidět, a tím vyplňuje prázdná místa. Toto je trochu složitější, protože vyžaduje rekurzivní příkaz SQL, ale je to známý trik:

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

Když to rozdělíme, CTE používá sjednocení, které odkazuje na sebe, aby rekurzivně přidalo jeden den po druhém k ​​předchozímu datu a zapamatovalo si toto datum jako součást tabulky. Pokud byste spustili jednoduchý příkaz, který používal CTE a právě z něj vybrali *, uvidíte seznam dat mezi začátkem a koncem. Poté příkaz připojí tento seznam dat k tabulce protokolu na základě data časového razítka protokolu, přičemž zachová data, která nemají žádné položky protokolu pomocí levého spojení (přebere všechny řádky z „levé“ strany, zda mají odpovídající řádky na „ pravá" strana nebo ne). Nakonec místo toho seskupíme podle data a počítáme a měli bychom dostat požadovanou odpověď.



  1. SQL Join na hodnotách null

  2. neúspěšné provedení příkazu s php a mysql

  3. Znamená omezení Postgres UNIQUE index?

  4. mysql kontingenční tabulka s řetězcovými hodnotami