2016-01-21 45 views
0

選擇計數可以說我有以下查詢:0計數

SELECT top (5) CAST(Created AS DATE) as DateField, 
    Count(id) as Counted 
FROM Table 
GROUP BY CAST(Created AS DATE) 
order by DateField desc 

可以說,它會返回以下數據集

DateField Counted 
2016-01-18 34 
2016-01-17 99 
2016-01-14 1 
2015-12-28 1 
2015-12-27 6 

但是,當我爲某日起計算= 0,我想在結果集中獲得。因此,例如它應該看起來像下面這樣

DateField Counted 
2016-01-18 34 
2016-01-17 99 
2016-01-16 0 
2016-01-15 0 
2016-01-14 1 

謝謝!

+5

想一想這一秒....如果計數爲0,這意味着沒有行返回。沒有行,你不能得到回報。你可以做的是使用另一個表格(如Tally表格)作爲查詢的基礎,並將左連接添加到您的計數邏輯中。這樣,當這個日期沒有數據時,你仍然可以獲得一排。合理? –

+3

使用數字表格生成所有必要的日期,然後將您的查詢添加到該日期。 –

回答

1

擴展KM的答案,你需要一個日期表,就像一個數字表。 網絡上有很多例子,但這裏有一個簡單的例子。

CREATE TABLE DateList (
DateValue DATE, 
CONSTRAINT PK_DateList PRIMARY KEY CLUSTERED (DateValue) 
) 
GO 
-- Insert dates from 01/01/2015 and 12/31/2015 
DECLARE @StartDate DATE = '01/01/2015' 
DECLARE @EndDatePlus1 DATE = '01/01/2016' 
DECLARE @CurrentDate DATE = @StartDate 

WHILE @EndDatePlus1 > @CurrentDate 
    BEGIN 
    INSERT INTO DateList VALUES (@CurrentDate) 
    SET @CurrentDate = DATEADD(dd,1,@CurrentDate) 
    END 

現在你有一個表

enter image description here

那麼你可以重寫查詢,如下所示:

SELECT top (5) DateValue, isnull(Count(id),0) as Counted 
FROM DateList 
LEFT OUTER JOIN Table 
    on DateValue = CAST(Created AS DATE) 
GROUP BY DateValue 
order by DateValue desc 

有兩點需要注意: 你需要一個where子句指定你的範圍。 演員陣容並不理想。日期表中的類型應與常規表中的類型相匹配。

1

還有一個解決方案作爲一個單一的查詢:

;WITH dates AS 
(
    SELECT CAST(DATEADD(DAY, ROW_NUMBER() OVER (ORDER BY [object_id]) - 1, '2016-01-14') as date) 'date' 
    FROM sys.all_objects 
) 
SELECT TOP 5 
     [date] AS 'DateField', 
     SUM(CASE WHEN Created IS NULL THEN 0 ELSE 1 END) AS 'Counted' 
    FROM dates 
    LEFT JOIN Table ON [date]=CAST(Created as date) 
GROUP BY [date] 
ORDER BY [date] 
+0

不確定你爲什麼使用系統表來生成行 –

+0

我們只需要一個數字序列(或日期)。您可以像下面的答案中那樣使用臨時表格,或者使用任意具有大量行的表格或視圖根據行號生成序列。查看sys.all_objects已經足夠用於這個目的,但是你可以使用你自己的表f.e. 'SELECT TOP 1000 CAST(DATEADD(DAY,ROW_NUMBER()OVER(ORDER BY創建)-1, '2016年1月14日')作爲日期) '日期' FROM Table' –

1

對於更前衛的解決方案,你可以使用遞歸公用表表達式創建日期列表。請注意:不要在日常工作中使用遞歸公用表表達式!它們很危險,因爲很容易創建一個永不終止的程序。

DECLARE @StartDate date = '1/1/2016'; 
    DECLARE @EndDate date = '1/15/2016'; 

    WITH DateList(DateValue) 
    AS 
    (
      SELECT DATEADD(DAY, 1, @StartDate) 
      UNION ALL 
      SELECT DATEADD(DAY, 1, DateValue) 
      FROM DateList 
      WHERE DateList.DateValue < @EndDate 
    ) 
    SELECT DateValue, isnull(Count(id),0) as Counted 
    FROM DateList 
    LEFT OUTER JOIN [Table] 
     ON DateValue = CAST(Created AS DATE) 
    GROUP BY DateValue 
    ORDER BY DateValue DESC