2012-10-12 46 views
1

我在SQL Server 2008中工作,我正在寫一個存儲過程,它彙集每週數據。如何在SQL每週彙總數據,幷包括跳過周太

代碼聚集

ALTER PROCEDURE [dbo].[ups_URLBatchStats] 
    (@startDate datetime, @endDate datetime,@source varchar(8)) 
AS BEGIN 
    SELECT 
     DATEADD(wk, DATEDIFF(wk, 0, ScheduleDate), 6) AS [Week Commencing], 
     SUM(Unresolved) AS Unresolved, 
     SUM(Resolved) AS Resolved, 
     SUM(TurkSpend) AS TurkSpend 
    FROM 
     dbo.V_URLBatchStats 
    WHERE 
     ScheduleDate BETWEEN @startDate AND @endDate 
     AND Source = ISNULL(@source, Source) 
    GROUP BY 
     DATEADD(wk, DATEDIFF(wk, 0, ScheduleDate), 6) 
    ORDER BY 
     DATEADD(wk, DATEDIFF(wk, 0, ScheduleDate), 6) 
END 

顯示它給了我正確的結果,但如果有任何星期沒有數據我有在列的「0」值來證明這一點。

所以,我怎麼能處理這些跳過每週行?

在此先感謝。

回答

1

好像你正在選擇錯誤的一週,我試圖解決這個問題:

SELECT dateadd(wk, number, DATEADD(wk, DATEDIFF(wk, 0, @startdate)-1, 6)) AS [Week Commencing], 
coalesce(SUM(Unresolved), 0) AS Unresolved, 
coalesce(sum(Resolved), 0)as Resolved, 
coalesce(sum(TurkSpend), 0) as TurkSpend 
FROM dbo.V_URLBatchStats 
right join 
master..spt_values 
on ScheduleDate between @startDate and @endDate and Source=ISNULL(@source,Source) 
where type = 'P' and dateadd(wk, number, DATEADD(wk, DATEDIFF(wk, 0, @startdate)-1, 6)) <= @enddate 
GROUP BY dateadd(wk, number, DATEADD(wk, DATEDIFF(wk, 0, @startdate)-1, 6)) 
ORDER BY dateadd(wk, number, DATEADD(wk, DATEDIFF(wk, 0, @startdate)-1, 6)) 
+0

感謝您的重播,這是好的,但有一個問題,它實際上產生錯誤的結果,但好處是,它也包括周,其不是在數據庫中的記錄。 –

+0

@PavanTiwari我的版本找到一週的開始。測試這個:SELECT DATEADD(wk,DATEDIFF(wk,0,'2011-01-01') - 1,6)它找到了本週的第一個星期一。所以我認爲這是你正在使用的腳本是錯誤的 –

1

你可以用產生的行號與RIGHT JOIN系統對象的周柱:

SELECT o.Num AS [Week Commencing], SUM(Unresolved) AS Unresolved,sum(Resolved)as Resolved,sum(TurkSpend) as TurkSpend 
FROM dbo.V_URLBatchStats s 
RIGHT JOIN (SELECT ROW_NUMBER() OVER (ORDER BY object_id) as [Num] FROM sysobjects) o 
    on DATEADD(wk, DATEDIFF(wk, 0, ScheduleDate), 6) = o.Num 
WHERE ScheduleDate between @startDate and @endDate 
AND Source=ISNULL(@source,Source) 
GROUP BY DATEADD(wk, DATEDIFF(wk, 0, ScheduleDate), 6), o.Num 
ORDER BY 1 

注意這是從內存和未經考驗的寫的,但原則應該工作。

+0

Thannks您的回覆,但你可以explane什麼在上面的查詢OBJECT_ID。 –

+0

來填補空白,你需要一些東西來產生中間的數字。 sysobjects表中包含大量數據,所以通過使用'ROW_NUMBER()'函數,您可以生成要加入的數字。 – cjk

+0

OK 但我得到一個錯誤 無效列名「OBJECT_ID」。 –