2013-07-04 1 views
2

У меня проблема с программой, которую я пытаюсь закончить. У меня есть таблица, в которой хранятся три метки времени. Он используется для составления статистики запросов и ответов. Первая временная метка относится к дате и времени запроса (Date_Sent), два других - первый раз, когда один из наших экспертов отвечает на запрос (FirstResponse) и когда этот запрос выполняется (LastResponse). Я должен создать график на основе следующих критериев:Несколько вычисленных значений в одном операторе SQL

  1. Общее количество запросов в месяц
  2. Количество запросов ответили менее чем за два часа
  3. Количество запросов откликнулись менее чем за 24 часа, но более двух
  4. количество запросов ответили менее чем за 48 часов, но более 24
  5. количество запросов ответили менее чем за 72 часа, но более 48
  6. количество запросов ответили менее чем 96 часов, но более 72

Я могу сделать первое требование:

SELECT Count(Date_Sent) AS TotalQueries, 
     SUBSTRING(CONVERT(VARCHAR(11), Date_Sent, 113), 4, 8) AS Month, 
     RIGHT(CONVERT(VARCHAR(7), Date_Sent, 120), 2) AS Month_Order 
FROM AskAO.dbo.AskAO_Stats 
WHERE Date_Sent BETWEEN '6/1/2012' AND '6/30/2013' AND 
     FirstResponse != '' AND 
     LastResponse != '' AND 
     FirstResponse < LastResponse 
GROUP BY SUBSTRING(CONVERT(VARCHAR(11), Date_Sent, 113), 4, 8), 
     CONVERT(VARCHAR(7), Date_Sent, 120) 
ORDER BY SUBSTRING(CONVERT(VARCHAR(11), Date_Sent, 113), 4, 8) 

Я смог получить этот результат выборки:

TotalQueries  Month Month_Order 
    655  Jun 2013  06 
    289  May 2013  05 

Однако, я не Не знаю, как получить других: (Я знаю, что могу рассчитать значения через DateDiff, но мне нужно было бы количество запросов, соответствующих этим конкретным критериям в месяц. Я должен был бы это:

TotalQueries 2Hrs 24Hrs 48Hrs 72Hrs 96Hrs Month  Month_Order 
    655  300 190 80  55  30 Jun 2013  06 
    289  180  50 30  15  14 May 2013  05 

Я незнаком с осложненным SQL, так что я не уверен, если это выполнимо или нет.

+0

Как вы определяете «отреагировали»: время между последним ответом и первым ответом или между датой и первым ответом? –

+0

Любая причина, по которой вы пытаетесь сделать все это в SQL? Можете ли вы отменить набор записей и фрагмент/кости с кодом? – David

+0

@StasYarkin Спасибо за ответ :) Время ответа между датой и первым ответом :) В принципе, я вычисляю, как быстро наши специалисты отвечают на отдельные запросы. – Poch

ответ

3

попробовать что-то вроде этого

SELECT Count(Date_Sent) AS TotalQueries, 
    SUBSTRING(CONVERT(VARCHAR(11), Date_Sent, 113), 4, 8) AS Month, 
    RIGHT(CONVERT(VARCHAR(7), Date_Sent, 120), 2) AS Month_Order , 
    SUM(CASE WHEN DATEDIFF(HOUR, FirstResponse, LastResponse) < 2 THEN 1 ELSE 0 END) AS LessThan2Hours, 
    SUM(CASE WHEN DATEDIFF(HOUR, FirstResponse, LastResponse) between 2 AND 24 THEN 1 ELSE 0 END) AS LessThan24Hours, 
    SUM(CASE WHEN DATEDIFF(HOUR, FirstResponse, LastResponse) between 25 AND 48 THEN 1 ELSE 0 END) AS LessThan24Hours, 
    SUM(CASE WHEN DATEDIFF(HOUR, FirstResponse, LastResponse) between 25 AND 48 THEN 1 ELSE 0 END) AS LessThan48Hours, 
    SUM(CASE WHEN DATEDIFF(HOUR, FirstResponse, LastResponse) between 49 AND 72 THEN 1 ELSE 0 END) AS LessThan72Hours, 
    SUM(CASE WHEN DATEDIFF(HOUR, FirstResponse, LastResponse) between 73 AND 96 THEN 1 ELSE 0 END) AS LessThan96Hours 

FROM AskAO.dbo.AskAO_Stats 
WHERE Date_Sent BETWEEN '6/1/2012' AND '6/30/2013' AND FirstResponse != '' AND LastResponse != '' AND FirstResponse < LastResponse 
GROUP BY SUBSTRING(CONVERT(VARCHAR(11), Date_Sent, 113), 4, 8), CONVERT(VARCHAR(7), Date_Sent, 120) 
ORDER BY SUBSTRING(CONVERT(VARCHAR(11), Date_Sent, 113), 4, 8) 
+0

Обратите внимание, что датифик работает на границах периода времени, а не на точные различия в единицах - так датифик в часах между 01: 59:59 и 03:00:00 вернутся 2, несмотря на то, что между двумя моментами прошло всего 1 час и 1 минута. Использование даты в секундах (и умножение диапазонов значений на 3600) должно быть более точным. –

+0

@MarkBannister. хороший момент, я пропустил это, спасибо –

+0

Ребята, большое спасибо за это !!!!!Я смог создать таблицу через коды, которые вы, ребята, дали! :) Спасибо Спасибо спасибо!!!! :) – Poch

1

Дело в том, COUNT() рассчитывает только значения, которые не являются пустым. Таким образом, вы можете написать некоторое выражение в пределах COUNT(...) в соответствии с вашей логикой в ​​некотором смысле, что оно равно null, когда вы не хотите суммировать строку, а не в противном случае. Например, чтобы подсчитать количество ответов менее чем за два часа, вы можете написать:

COUNT(CASE WHEN DATEDIFF(HOUR, Date_Sent, FirstResponse) < 2 THEN Date_Sent ELSE NULL END) AS [2Hrs] 

Вы можете сделать все аналогичные случаи.