2016-08-18 61 views
1

我试图将包含GROUP BYCOUNTAVG语句组合在一起。我正在使用MSSql。SQL显示计数与AVG

是否有可能在COUNT结果旁边有AVG

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 

我收到以下错误,当我尝试运行这最后询问:

列“MyTable的.ActionID'在选择列表中无效,因为它不是 包含在聚合函数或GROUP BY子句中。

请注意,我必须做一个DATEDIFF来从同一个表和列中的2个不同的行。 我的表:

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

只是做* AVG(b.FinalAvg)FinalAvg * – mxix

+0

谢谢@mxix但我仍然得到同样的错误。 –

+1

将AVG添加到外部FinalAvg。每个含有group by的查询,所有字段都必须通过OR被聚合(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

由于原始查询不是'AVG()',我将等待OP的响应。请参阅更新AVG SQL。 – Parfait

+0

谢谢。这似乎很接近。您的查询不是“行动”的“分组”。它返回所有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 

这将让你在那里,但我猜测,它可以简化甚至更多取决于你实际上是如何过滤你的日期时间档案。

它的基本知识是使用条件聚合计数和左平均加权。

+0

谢谢你马特。你的答案是以'ActionCount'的形式返回'1',但它足够接近我可以运行这个查询和我的COUNT'查询来匹配列。 –

+1

ahh是的,你是对的,因为我在计算ActionId,它是一个有点直观的计数器,但是使用SUM(当1 END时的情况)将与你正在寻找的计数相同。我相应地更新了答案 – Matt