2015-11-20 25 views
0

我有一個SQL查詢(SQL Server),它將我的信息按星期結束分組。這工作正常。問題是,如果由於某種原因,我沒有任何數據一週,那麼這一週將不會生成,我需要繪製的圖表將是錯誤的。SQL如何獲得從現在兩個月到過去的所有星期

這是一個簡單的數據,我從我的查詢得到:

enter image description here

這是我的查詢:

select 
permittype, 
count(0) as total, 
DATEADD(dd, 0, DATEDIFF(dd, 0, DATEADD(d, 7 - DATEPART(DW, ei.createddate),ei.createddate))) as WeekEnding 
from employee_incident ei 
where ei.incidentcode = 'P' 
and ei.isactive = 1 
and ei.createddate >= DATEADD(month, -2, GETDATE()) 
group by 
permittype, 
DATEADD(dd, 0, DATEDIFF(dd, 0, DATEADD(d, 7 - DATEPART(DW, ei.createddate),ei.createddate))) 
order by 
DATEADD(dd, 0, DATEDIFF(dd, 0, DATEADD(d, 7 - DATEPART(DW, ei.createddate),ei.createddate))) desc 

我怎樣才能,如果本週2015-11- 14'沒有數據我得到0作爲總價值?現在,如果那一週沒有價值,我只是不明白。

+2

你將需要創建一個星期表和'LEFT JOIN'它到你的表。 –

回答

0

這將需要一個星期表和一個LEFT JOIN或一個FULL OUTER JOIN,具體取決於你開始查詢的位置。在星期表中,您可以創建一年的每週記錄。您可以添加有關該周的各種數據,但我們可以從以下開始。

CREATE TABLE weeks (
    week_number TINYINT NOT NULL PRIMARY KEY, 
    start_date DATETIME NOT NULL, 
    end_date DATETIME NOT NULL, 
); 

在下面的例子中,我使用FULL OUTER JOIN,因爲我已經離開了查詢直接從employee_incident表走,但是如果你把它改爲從周表,你可以LEFT JOIN到employee_incident表開始。當employee_incident和COALESCE中不存在數據時,我們使用COALESCE給出允許類型的默認0值,以便在有數據時優先從employee_incident獲取數據。

CROSS APPLY是爲了避免不得不重複代碼來獲得一週結束。我們寫一次,然後可以使用它的別名。

SELECT COALESCE(permittype, 0) as permittype, 
    count(0) as total, 
    COALESCE(EndOfWeek, week.end_date) as WeekEnding 
from employee_incident ei 
cross apply ( 
    select DATEADD(dd, 0, DATEDIFF(dd, 0, DATEADD(d, 7 - DATEPART(DW, ei.createddate),ei.createddate))) as EndOfWeek 
) _ 
full outer join weeks on ei.WeekEnding = weeks.end_date 
where (ei.incidentcode = 'P' 
    and ei.isactive = 1 
    and ei.createddate >= DATEADD(month, -2, GETDATE())) 
or weeks.end_date is null 
GROUP BY COALESCE(permittype, 0), 
     COALESCE(EndOfWeek, week.end_date) 
ORDER BY WeekEnding DESC 

我還沒有創建這些表並執行它,所以讓我知道如果在SQL中有任何錯誤。

相關問題