-1

我有一张表,我想根据我的 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')
4

2 回答 2

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 年 1 月 6 日星期日没有任何呼叫,则该日期不会有一行。

月平均

Oracle 将允许您将聚合函数嵌套到最多两个级别,这可以通过执行以下操作来获得每月AVG平均值COUNT

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

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

-- MySQL
SELECT AVG(DailyCount) AS MonthlyAverage
FROM (
  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)
) DayCounts
于 2013-06-12T02:19:17.573 回答
1

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

您还可以使用三元 IF() 函数执行许多技巧,以特殊方式隔离您的组(将几周与周末隔离)。

于 2013-06-12T02:06:26.210 回答