2015-09-04 3 views
0

У меня есть простая Хранимая процедура, которую я использую, чтобы показать базовую статистику пользователя. Я показываю общее количество заявок, общее время, потраченное на все эти материалы, а также среднее время.TSQL Среднее время

Я столкнулся с двумя проблемами. Во-первых, это прерывается, когда во внутренних выборках имеется несколько записей.

Второй вопрос: как правильно рассчитать среднее время всех записей для этого пользователя.

Может ли кто-нибудь указать, каким образом я могу изменить приведенный ниже код, чтобы получить общее время и среднее время по всем записям, а не только по одному?

SELECT count(itemID) AS totalSubmissions, 
     CONVERT(VARCHAR(20), GETUTCDATE(), 100) as lastUpdate, 
     (
     SELECT COALESCE(DATEDIFF(MINUTE, s.startTime, s.endTime + 1) , 0) 
     FROM itemTracker_records as s 
     WHERE QID = @QID 
     ) as totalTime, 
     (
     SELECT COALESCE(DATEDIFF(MINUTE, s.startTime, s.endTime + 1) , 0) 
     FROM itemTracker_records as s 
     WHERE QID = @QID 
     ) as averageTime 
FROM itemTracker_records 
WHERE QID = @QID 
FOR XML PATH ('results'), TYPE, ELEMENTS, ROOT ('root') 
+0

['SUM'] (https://msdn.microsoft.com/en-us/library/ms187810.aspx)? Разделите на ['COUNT'] (https://msdn.microsoft.com/en-us/library/ms175997.aspx)? – HABO

ответ

2
  1. Конечно, это сломает - нет агрегация в подзапросов. Хотя, в этом конкретном случае, не кажется, что вы когда-нибудь в них нуждаетесь.
  2. Среднее значение, как ни удивительно, рассчитывается функцией AVG().
  3. (Образованное предположение), вы, вероятно, имели в виду, что вам нужно хотя бы одно минутное время, если указаны начальные и конечные, но равные? Увы, в вашем коде вы добавите 1 день - исправлено.

Таким образом, результат будет выглядеть примерно так:

SELECT count(r.itemID) AS totalSubmissions, 
    CONVERT(VARCHAR(20), GETUTCDATE(), 100) as lastUpdate, 
    sum(isnull(DATEDIFF(MINUTE, r.startTime, r.endTime) + 1 , 0)) as [totalTime], 
    avg(isnull(DATEDIFF(MINUTE, r.startTime, r.endTime) + 1 , 0)) as [averageTime] 
FROM dbo.itemTracker_records r 
WHERE r.QID = @QID 
FOR XML PATH ('results'), TYPE, ELEMENTS, ROOT ('root'); 

последнее, но не менее важное: никогда не забывать схем и объектов псевдонимов, если вы намеренно пытается запутать кого-то, сами включены.

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