2010-03-22 95 views
1

我有一個簡單的用戶生產報告,每日配額跟蹤。 sql會爲所有用戶返回一週的數據,並且每天都會跟蹤其總數。問題在於,如果他們出局一天並且當天的產量爲零,那麼結果查詢只是跳過那一天而離開它。即使表格當天沒有人員記錄,我也想要返回幾天。SQL服務器查詢不顯示每日日期結果

table: 
user date 
andy 3/22/10 
andy 3/22/10 
andy 3/23/10 
andy 3/24/10 
andy 3/26/10 


result: 
andy 
3/22/10 2 
3/23/10 1 
3/24/10 1 
3/25/10 0 
3/26/10 1 

所以我的問題是如何得到的查詢返回10年3月25日最新與0

計數(當前查詢我使用):

SELECT A.USUS_ID as Processor, CONVERT(VARCHAR(10),A.CLST_STS_DTM,101) as Date, 
COUNT(A.CLCL_ID) as DailyTotal 

FROM CMC_CLST_STATUS A 
WHERE A.CLST_STS_DTM >= (@Day) AND 
DATEADD(d, 5, @Day) > A.CLST_STS_DTM 

GROUP BY A.USUS_ID, CONVERT(VARCHAR(10),A.CLST_STS_DTM,101) 
ORDER BY A.USUS_ID, CONVERT(VARCHAR(10),A.CLST_STS_DTM,101) 

回答

3

您需要有該日期的數據,否則sql不能產生它。

圍繞這樣一個問題最常見的方法是有一個包含所有日期的日期表。然後你可以加入,這將允許你在該日期獲得一個零條目。

您可以將此表永久保存在數據庫中,或者在運行查詢時生成它。哪種方式最好取決於使用等

編輯:熱膨脹係數的方法來創建日期表

DECLARE @minDate DATETIME; 
DECLARE @maxDate DATETIME; 

SET @minDate = '2010-03-01 00:00:00.000'; 
SET @maxDate = '2010-03-10 00:00:00.000'; 

WITH DateRange ([date]) 
AS 
(
    SELECT @minDate 
    UNION ALL 
    SELECT 
     DATEADD(DAY, 1, [date]) 
    FROM 
     DateRange 
    WHERE 
     DATEADD(DAY, 1, [date]) <= @maxDate 
) 

SELECT 
    * 
FROM 
    DateRange 

編輯2:我還沒有通過檢查這一點,但它應該與你的數據庫。

DECLARE @day DATETIME 

SET @day = CAST(FLOOR(CAST(GETDATE() AS float)) AS DATETIME); 

WITH DateRange ([Date]) 
AS 
(
    SELECT @day 
    UNION ALL 
    SELECT 
     DATEADD(DAY, 1, [Date]) 
    FROM 
     DateRange 
    WHERE 
     DATEADD(DAY, 1, [Date]) <= DATEADD(DAY, 5, @day) 
) 
SELECT 
    A.USUS_ID as Processor, 
    DateRange.[Date] as Date, 
    COUNT(A.CLCL_ID) as DailyTotal 
FROM 
    CMC_CLST_STATUS A 
INNER JOIN 
    DateRange 
ON 
    A.CLST_STS_DTM >= DateRange.[Date] 
AND 
    A.CLST_STS_DTM < DATEADD(DAY, 1, DateRange.[Date]) 
GROUP BY 
    A.USUS_ID, 
    DateRange.[Date] 
ORDER BY 
    A.USUS_ID, 
    DateRange.[Date] 
+0

什麼是CTE方法?我喜歡這個想法來創建它,因爲報告只能由一個人每月運行一次。 – 2010-03-22 13:44:38

+0

CTE是一個通用表格表達式。它允許一個表遞歸地調用它自己。它有很多用途,其中之一是生成通常稱爲「數字」表的非常簡單的方法。 – 2010-03-22 13:46:03

+0

@Andrew Jahn - 有一個谷歌公共表格表達式 - 這就是在這裏提到的。 – Paddy 2010-03-22 13:46:24

0

你幾乎需要用一個「表」(函數生成?不在2005年,但我認爲)包含所有日期在開始日期和結束日期之間進行連接。沒有其他的方式 - SQL不會顯示不存在的東西。

1

這是來自存儲過程嗎?如果是這樣,請創建一個包含感興趣日期的臨時表,然後通過合適的連接和聚合使用該表來獲取您正在查找的數據...