2016-08-18 3 views
1

Я пытаюсь объединить COUNT, который содержит GROUP BY с оператором AVG. Я использую MSSql.SQL Show COUNT с AVG

Возможно ли иметь AVG рядом с результатами COUNT?

COUNT SQL:

SELECT ActionId, COUNT(ActionId) as ActionCount 
FROM AIFMESSAGELOG 
WHERE DIRECTION = 1 AND CREATEDDATETIME >= '2016-08-15 23:59:59.000' AND CREATEDDATETIME <= '2016-08-16 23:59:59.000' 
Group By ActionId 
Order By ActionCount DESC 

Это возвращает:

ActionId  ActionCount 
Insert Action 672 
Update Action 184 

AVG SQL:

SELECT DATEDIFF(millisecond, b.CREATEDDATETIME, a.CREATEDDATETIME)*1.0 AS AvgTime 
FROM AIFMESSAGELOG a 
INNER JOIN AIFMESSAGELOG b 
ON a.REQUESTMESSAGEID = b.MESSAGEID 
WHERE b.CREATEDDATETIME >= '2016-08-15 23:59:59.000' AND b.CREATEDDATETIME <= '2016-08-16 23:59:59.000' AND a.ACTIONID = 'Insert Action' 
ORDER BY A.CREATEDDATETIME DESC 

Это возвращает:

AvgTime 
50 

Результат Необходимое:

ActionId  ActionCount AvgTime 
Insert Action 672   50 
Update Action 184   25 

Мой код:

SELECT a.ActionId, COUNT(a.ActionId) as ActionCount, b.FinalAvg 
FROM AIFMESSAGELOG a 
INNER JOIN 
(
SELECT AVG(AvgTime) AS FinalAvg, ACTIONID 
FROM 
(
SELECT c.ActionID, DATEDIFF(millisecond, d.CREATEDDATETIME, c.CREATEDDATETIME)*1.0 AS AvgTime 
FROM AIFMESSAGELOG c 
INNER JOIN AIFMESSAGELOG d 
ON c.REQUESTMESSAGEID = d.MESSAGEID 
)MyTable 
) b 
ON a.ACTIONID = b.ACTIONID 
WHERE a.DIRECTION = 1 AND a.CREATEDDATETIME >= '2016-08-15 23:59:59.000' AND a.CREATEDDATETIME <= '2016-08-16 23:59:59.000' 
Group By a.ActionId 
Order By ActionCount DESC 

я получаю следующее сообщение об ошибке при попытке запустить этот последний запрос:

Column «MyTable .ActionID 'недопустим в списке выбора, потому что это нет содержащихся либо в агрегатной функции, либо в предложении GROUP BY.

Обратите внимание, что я должен сделать DATEDIFF, чтобы получить из двух разных строк в одной таблице и столбце. Мой стол:

AIFMESSAGELOG 
------------- 
ACTIONID 
REQUESTMESSAGEID 
MESSAGEID 
DIRECTION 
CREATEDDATETIME 
+1

просто сделайте * AVG (b.FinalAvg) FinalAvg * – mxix

+0

Спасибо @mxix, но я все равно получаю ту же ошибку. –

+1

Добавить AVG во внешний FinalAvg. Каждый запрос, у которого есть группа, все поля должны либо быть в группе, либо быть агрегированы (SUM, MAX, AVG, ...). Ошибка, указывающая на то, что b.FinalAvg не ссылается в GROUP BY и не агрегируется. – mxix

ответ

2

Рассмотрим объединение двух агрегатных производных таблиц, к которым присоединились ACTIONID:

SELECT t1.ActionId, t1.ActionCount, t2.AvgTime 

FROM  
    (SELECT ActionId, COUNT(ActionId) as ActionCount 
    FROM AIFMESSAGELOG 
    WHERE DIRECTION = 1 
    AND CREATEDDATETIME >= '2016-08-15 23:59:59.000' 
    AND CREATEDDATETIME <= '2016-08-16 23:59:59.000' 
    GROUP By ActionId) As t1 

INNER JOIN  
    (SELECT a.ACTIONID, 
      AVG(DATEDIFF(millisecond, b.CREATEDDATETIME, a.CREATEDDATETIME)*1.0) AS AvgTime 
    FROM AIFMESSAGELOG a 
    INNER JOIN AIFMESSAGELOG b 
      ON a.REQUESTMESSAGEID = b.MESSAGEID 
    WHERE b.CREATEDDATETIME >= '2016-08-15 23:59:59.000' 
    AND b.CREATEDDATETIME <= '2016-08-16 23:59:59.000' 
    GROUP BY a.ACTIONID) AS t2 

ON t1.ActionId = t2.ACTIONID 
ORDER BY t1.ActionCount DESC 
+0

Вы потеряли операцию AVG() –

+0

Я буду ждать ответа OP, поскольку исходный запрос не был 'AVG()'. См. Обновление AVG SQL. – Parfait

+0

Спасибо. Кажется, это близко. Ваш запрос не 'GROUPING'' Action'. Он возвращает все 672 строки 'Action' и' DATEDIFF', но каждая строка имеет правильный 'COUNT'. –

1
SELECT 
    a.ActionId 
    ,SUM(CASE 
        WHEN a.DIRECTION = 1 
         AND a.CREATEDDATETIME >= '2016-08-15 23:59:59.000' 
         AND a.CREATEDDATETIME <= '2016-08-16 23:59:59.000' 
        THEN 1 END) AS ActionCount 
    ,AVG(DATEDIFF(millisecond, b.CREATEDDATETIME, a.CREATEDDATETIME)*1.0) AS AvgTime 
FROM 
    AIFMESSAGELOG a 
    LEFT JOIN AIFMESSAGELOG b 
    ON a.REQUESTMESSAGEID = b.MESSAGEID 
    AND b.CREATEDDATETIME >= '2016-08-15 23:59:59.000' AND b.CREATEDDATETIME <= '2016-08-16 23:59:59.000' 
    AND a.ACTIONID = 'Insert Action' 
GROUP BY 
    a.ActionId 
ORDER BY A.CREATEDDATETIME DESC 

Это приведет вас туда, но я предполагаю, что это может быть упрощено еще больше в зависимости от того, как вы на самом деле хотите отфильтровать ваши фиды date_time.

Основой этого является использование условной агрегации для счета и LEFT JOIN для среднего.

+0

Спасибо, Мэтт. Ваш ответ возвращал '1' в качестве« ActionCount », но он получил меня достаточно близко, чтобы я мог запустить этот запрос, а мой запрос« COUNT »соответствовал столбцам. –

+1

ahh да, вы правы, потому что я подсчитывал ActionId, это немного счетчик интуитивных, но с использованием SUM (случай, когда 1 END) будет таким же, как и счет, который вы ищете. Я обновил ответ соответственно – Matt