簡體   English   中英

如果沒有行,則 SQL 查詢為 COUNT(*) 返回 0

[英]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;

文檔https://docs.microsoft.com/en-us/sql/t-sql/queries/with-common-table-expression-transact-sql?view=sql-server-ver15

嘗試這個:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM