Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Policz SQL, aby uwzględnić wartości zerowe

Nie tyle klauzula WHERE, co GROUP BY. Zapytanie zwróci dane tylko dla istniejących wierszy. Oznacza to, że podczas grupowania według daty sygnatury czasowej zostaną zwrócone tylko dni, dla których istnieją wiersze. SQL Server nie może wiedzieć z kontekstu, że chcesz „wypełnić puste miejsca” i nie wiedziałby, czym.

Normalną odpowiedzią jest CTE, które generuje wszystkie dni, które chcesz zobaczyć, wypełniając w ten sposób puste miejsca. Ta jest trochę trudna, ponieważ wymaga rekurencyjnej instrukcji SQL, ale jest to dobrze znana sztuczka:

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

Rozbijając to, CTE używa unii, która odwołuje się do siebie, aby rekursywnie dodawać jeden dzień do poprzedniej daty i zapamiętywać tę datę jako część tabeli. Jeśli uruchomisz prostą instrukcję, która używa CTE i po prostu wybierzesz z niej *, zobaczysz listę dat między początkiem a końcem. Następnie instrukcja dołącza tę listę dat do tabeli dziennika na podstawie daty sygnatury czasowej dziennika, zachowując daty, które nie mają wpisów dziennika przy użyciu lewego sprzężenia (pobiera wszystkie wiersze z „lewej” strony, niezależnie od tego, czy mają pasujące wiersze w „ po prawej stronie lub nie). Na koniec grupujemy według daty i zamiast tego liczymy, a my powinniśmy otrzymać odpowiedź, której potrzebujesz.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak uruchomić pakiet SSIS bez SQL Server?

  2. Plusy i minusy TRUNCATE vs DELETE FROM

  3. Usuń liczby z serwera sql string

  4. Serwer SQL ignoruje wielkość liter w wyrażeniu gdzie

  5. Wstaw do tabeli temp w CTE