2015-08-18 235 views
0

我現在有一個SQL查詢,看起來像這樣每個日期:SQL查詢範圍

SELECT CONVERT(DECIMAL(5,1),(
    CONVERT(DECIMAL(6,1),(
     SELECT COUNT(*) 
     FROM Requests 
     LEFT JOIN RequestSLA ON Requests.RequestId = RequestSLA.RequestId 
     WHERE DateLogged between '2015/03/01' and '2015/08/17' 
     AND RespondBy <= Responded 
    ))/CONVERT(DECIMAL(6,1),(
     SELECT COUNT(*) 
     FROM Requests 
     WHERE DateLogged between '2015/03/01' and '2015/08/17' 
    ))) 
*100) 

這將返回票是違反了迴應SLA(這裏是RespondBy之後有反應)的所有門票的百分比在提供的日期範圍內。是否可以修改此查詢以分別顯示每天的百分比? I.E.是這樣的:

Date  Percentage 
2015-03-01 10 
2015-03-02 7 

等等

我試圖用一個GROUP BY條款,但這並沒有工作,因爲DateLogged(這是什麼,我會通過被分組)不包括在聲明

+0

爲什麼兩個'CONVERT()'? – Barranka

回答

3

使用一個單一的查詢,而不是兩個相關子查詢的輸出,那麼你可以使用GROUP BY DateLogged,你只需把你的計數的一個範圍內的情況下表達:

SELECT r.DateLogged, 
     Total = COUNT(*), 
     BreachedSLA = COUNT(CASE WHEN sla.RespondBy <= sla.Responded THEN 1 END), 
     PercentBreached = CONVERT(DECIMAL(6, 1), 100.0 * COUNT(CASE WHEN sla.RespondBy <= sla.Responded THEN 1 END)/COUNT(*)) 
FROM Requests AS r 
     LEFT JOIN RequestSLA AS sla 
      ON r.RequestId = sla.RequestId 
WHERE r.DateLogged >= '20150301' 
AND  r.DateLogged <= '20150817' 
GROUP BY r.DateLogged; 

注意,我已將您的日期格式更改爲完全獨立於文化的格式yyyyMMdd,這是SQL Server中DATETIMESMALLDATETIME的唯一獨立格式,因此雖然邊界不太清晰,但它保證了正確的轉換,並且某些區域設置的格式爲yyyy/MM/dd會拋出一個錯誤,或者更糟的是它會被轉換爲一個無意的日期。

SET DATEFORMAT DMY; 
SELECT CONVERT(DATETIME, '2015/08/17') 

我也改變了你的BETWEEN子句>=<=,不是因爲它有什麼不同,而是因爲它更容易轉換成開放式的日期範圍,例如

WHERE r.DateLogged >= '20150301' 
AND  r.DateLogged < '20150818' 

隨着between '2015/03/01' and '2015/08/17',你可能會得到一個登錄日期的2015/08/17 10:00,未返回,而且往往是不直觀的,爲什麼。有關更多閱讀,請參閱What do BETWEEN and the devil have in common?

+0

喜歡sqlblog文章的名稱。我剛剛發現,我可能需要爲任何「已關閉」票證查詢第二組表格。這可以通過在最後的WHERE子句上面添加一個'UNION SELECT'來完成,並且複製要選擇的列,或者有更好的方法來完成嗎? – CyberJacob

+0

shold你沒有使用'count(distinct r.RequestId)'而不是'count(*)'? –

+0

我還應該指出,你想'sla.Responded',而不是'r.Responded' – CyberJacob