如何在我的Select中使用COUNT()和/或AVG()

时间:2013-06-12 01:44:10

标签: mysql oracle select count average

我有一个表,我希望根据我的mopactivity.calldate字段运行数月的数据。我希望能够将每日通话的平均值作为每月每天的每日计数。我也可以获得月平均电话费吗?你会如何使用COUNT()和/或AVERAGE()命令执行此操作?有没有办法在工作日而不是周末日期做平均值?我的SELECT语句如下所示。

SELECT mopactivity.mopid,
mopactivity.mopstatus,
mopactivity.calldate
FROM mopactivity
where mopactivity.calldate between to_date('01-JAN-13') 
and to_date('31-JAN-13 23:59:59')

2 个答案:

答案 0 :(得分:2)

按日计数

获取每日计数(Oracle语法):

-- Oracle
SELECT
  TRUNC(CallDate) AS Dt,
  COUNT(*) AS DailyCount
FROM MOPActivity
WHERE CallDate > DATE '2013-01-01' AND CallDate < '2013-02-01'
GROUP BY TRUNC(CallDate)

如果您使用的是MySQL,请将上面TRUNC(CallDate)的两个实例替换为DATE(CallDate)

-- MySQL
SELECT
  DATE(CallDate) AS Dt,
  COUNT(*) AS DailyCount
FROM MOPActivity
WHERE CallDate > DATE '2013-01-01' AND CallDate < '2013-02-01'
GROUP BY DATE(CallDate)

上面的查询将仅报告具有呼叫活动的日期,因此,例如,如果在2013年6月1日星期日没有任何呼叫,则该日期将不会有一行。

每月平均值

Oracle允许您将聚合函数最多嵌套到两个级别,这可用于通过执行AVG的{​​{1}}来获得每月平均值:

COUNT

MySQL不支持这一点,所以如果您使用MySQL,您可以将每日计数查询推送到子查询中,并使用外部查询计算平均值:

-- Oracle
SELECT AVG(COUNT(*)) AS MonthlyAverage,
FROM MOPActivity
WHERE CallDate > DATE '2013-01-01' AND CallDate < '2013-02-01'
GROUP BY TRUNC(CallDate)

答案 1 :(得分:1)

添加GROUP BY子句时,COUNT,SUM和AVG等组函数将对每个组进行操作。因此,您希望使用您的通话日期作为基础,使用各种分组创建查询。假设calldate是一个日期时间列,因此您可以使用各种技术来隔离这些分组,并使用DATE_FORMAT命令来获取每日,每周和每月分组。将这些变体用于GROUP BY,您的AVG和COUNT将按预期工作。

您可以使用三元IF()功能以特殊方式隔离您的群组(从周末隔离几周)。