2013-05-22 30 views
0

我正在使用SQL Server 2008 R2,並試圖對不同列進行多次計數,但無法弄清楚如何使其正常工作。我有兩個獨立工作的查詢,但在嘗試組合它們時遇到了麻煩。試圖通過@StartDate和@EndDate計算每個日期期間打開和關閉的票數。按日期在多列上計數函數(SQL Server)

例如,這裏是我的第一個查詢:(我們分配特定的代碼來區分票據創建的不同原因,只是想在那個行造成任何混淆的情況下拋出它,我們的日期也是日期時間格式,因此使用CAST)的

SELECT 
Cast(CreateDate AS Date) AS 'Date', 
Count(CreateDate) AS '# Created' 

FROM dbo.Tickets 

WHERE 
Cast(CreateDate AS Date) >= @StartDate and 
Cast(CreateDate AS Date) <[email protected] and 
(Reason >= 36 and Reason <= 41 OR Reason = 17) 

GROUP BY Cast(CreateDate AS Date) 

ORDER BY 'Date' 

其產生以下結果:

Date    # Created 
----------  ------------- 
5/1/2013   396 
5/2/2013   418 
5/3/2013   288 
5/4/2013   28 
5/5/2013   100 

我的第二個查詢是完全相同的「創建日期」查詢,只需替換爲「解析日期」的地方「CREATEDATE」位於。但是,2013年5月4日之前沒有解決問題的門票。

如何將這兩個查詢合併爲一個,並讓它返回如下的結果集?

Date    # Created   # Resolved 
----------  -------------  ------------- 
5/1/2013   396     400 
5/2/2013   418     322 
5/3/2013   288     280 
5/4/2013   28     0 
5/5/2013   100     11 

我覺得扔掉我的部分是表中沒有解決日期5/4/2013。任何幫助將非常感激。謝謝!

回答

0

試試這個:

with all_dates(the_date) 
as 
(
    select min(cast(createdate as date)) 
    from tickets 
    UNION ALL 
    select DATEADD(day,1,the_date) 
    from all_dates 
    where all_dates.the_date < GETDATE()+1 

) 

select the_date, 
     SUM(case when CAST(t.createdate as DATE) = ad.the_date then 1 else 0 end) as CreatedCount, 
     SUM(Case when CAST(t.resolveddate as DATE) = ad.the_date then 1 else 0 end) as ResolvedCount 
from all_dates ad 
left outer join tickets t 
on ad.the_date = CAST(t.createdate as DATE) 
or ad.the_date = CAST(t.resolveddate as DATE) 
group by ad.the_date 
option (MAXRECURSION 10000) 

我創建了一個CTE來存儲所有的第一次創建日期和今天之間的日期。這樣,即使您沒有在某個日期創建或解析票據,您仍然可以在結果中看到這一天。

+0

您需要像在'ON'子句中那樣在'CASE's中投射日期。 – HABO

+0

是的,我願意。謝謝。編輯。 –

+0

太棒了!我得到它完美的工作!非常感謝你的幫助!甚至沒有想過使用CTE :) – Grummer21