[英]SQL query returns 0 for COUNT(*) if no rows
我剛開始接觸SQL
,最近加入了這個論壇,所以我仍然缺乏知識。 如果我犯了任何錯誤,請體諒。
我打算獲取過去n天的數據。 對於每一天,查詢將計算總行數並返回結果。 但是,有些天沒有記錄,查詢也沒有返回當天的任何結果。 如果那天沒有記錄,我需要它返回0 。 我已經嘗試了多個查詢並研究了很長一段時間,但我似乎無法得到我需要的東西。
這是我的查詢:
select Date, COUNT(*) as TotalReservation
from Reservation
where Date between DateAdd(Day, -5, getdate()) and getDate()
group by Date
我得到的結果:
| Date | TotalReservation |
|----------|------------------|
|2021-06-04| 2 |
|2021-06-05| 3 |
|2021-06-06| 2 |
我想要的是:
| Date | TotalReservation |
|----------|------------------|
|2021-06-04| 2 |
|2021-06-05| 3 |
|2021-06-06| 2 |
|2021-06-07| 0 |
我試過ISNULL()
和COALESCE()
但它們也沒有工作。 如果有人能啟發我,將不勝感激。
描述:您可以使用遞歸 CTE 來構建您想要查看的“日期”列表。 我硬編碼了 5,因為那是你的例子,你可以使用任何對你有用的東西,甚至是一個變量。 LEFT JOIN 將確保您獲得范圍內每個日期的記錄,對於那些沒有數據的日期,您將獲得 0
代碼示例:
WITH dateTable AS (
SELECT
CAST(GETDATE() AS DATE )Date
UNION ALL
SELECT
DATEADD(DAY,-1,dateTable.Date) Date
FROM dateTable
WHERE Date >= GETDATE() - 5 /*Enter your number of days to go back, here*/
)
SELECT
dateTable.Date
,COUNT(Reservation.Date)
FROM dateTable
LEFT OUTER JOIN Reservation ON dateTable.Date = Reservation.Date
GROUP by dateTable.Date
ORDER BY dateTable.Date;
嘗試這個:
DECLARE @StartDate date = '2021-06-04'
, @Days int = 5
;
DECLARE @Reservation TABLE ([Date] date, TotalReservation int)
INSERT INTO @Reservation
VALUES
('2021-06-04', 2)
, ('2021-06-05', 3)
, ('2021-06-06', 2)
;
DECLARE @DateTable TABLE (DDate date);
WHILE @Days > 0
BEGIN
INSERT INTO @DateTable VALUES (DATEADD(day, @Days-1, @StartDate))
SET @Days = @Days -1
END
;
SELECT
[Date] = D.DDate
, TotalReservation = ISNULL((SELECT SUM(TotalReservation) FROM @Reservation WHERE D.DDate = [Date]), 0)
FROM @DateTable D
LEFT JOIN @Reservation R ON D.DDate = R.[Date]
ORDER BY [Date]
使用遞歸就像:
DECLARE @StartDate date = '2021-06-04'
, @Days int = 5
;
DECLARE @Reservation TABLE ([Date] date, TotalReservation int)
INSERT INTO @Reservation
VALUES
('2021-06-04', 2)
, ('2021-06-05', 3)
, ('2021-06-06', 2)
;
WITH DateTable AS (
SELECT
DDate = CONVERT(date, @StartDate)
UNION ALL
SELECT
DDate = DATEADD(day, 1, D.DDate)
FROM DateTable D
WHERE
DDate <= DATEADD(day, @Days-2, @StartDate)
)
SELECT
[Date] = D.DDate
, TotalReservation = ISNULL((SELECT SUM(TotalReservation) FROM @Reservation WHERE D.DDate = [Date]), 0)
FROM DateTable D
LEFT JOIN @Reservation R ON D.DDate = R.[Date]
ORDER BY [Date]
DECLARE @Reservation TABLE (ID int PRIMARY KEY IDENTITY(1,1), [Date] date)
DECLARE @Date smalldatetime = '20210604'
INSERT INTO @Reservation VALUES (@Date), (@Date),
(@Date + 1), (@Date + 1), (@Date + 1),
(@Date + 2), (@Date + 2);
WITH Dates_CTE (Date) AS (
SELECT @Date
UNION ALL
SELECT DATEADD(DAY, 1, Date)
FROM Dates_CTE
WHERE Date < @Date + 4
)
SELECT D.Date, COUNT(R.ID)
FROM Dates_CTE D
LEFT JOIN @Reservation R ON D.Date = R.Date
GROUP BY D.Date
ORDER BY D.Date
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.