2015-08-18 2 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) 

Это возвращает процент билетов, нарушенное их откликнулся ОАС (где откликнувшихся после RespondBy) для всех билетов в диапазоне дат. Можно ли адаптировать этот запрос, чтобы показывать процент за каждый день отдельно? И.Е. что-то вроде этого:

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; 

NB, я изменил формат даты на полностью независимый от культуры формат yyyyMMdd, это единственный независимый формат для DATETIME и SMALLDATETIME на SQL Server, поэтому, хотя он менее разборчив, он гарантирует правильное преобразование с определенными региональными настройками формата 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

Liking имя этой статьи sqlblog. Я только что обнаружил, что мне может потребоваться запросить второй набор таблиц для любых «закрытых» билетов. Можно ли это сделать, добавив 'UNION SELECT' чуть выше окончательного предложения WHERE и дублируя столбцы для выбора, или есть лучший способ сделать это? – CyberJacob

+0

sholdn't вы используете 'count (distinct r.RequestId)' вместо 'count (*)'? –

+0

Я также должен указать, что вы хотите «sla.Responded», а не «r.Responded» – CyberJacob

Смежные вопросы