我有一个表,我希望根据我的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')
答案 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()功能以特殊方式隔离您的群组(从周末隔离几周)。