-1

mopactivity.calldate フィールドに基づいて、1 か月分のデータを実行するテーブルがあります。月の各日の毎日のカウントとして、毎日の通話の平均を取得できるようにしたいと考えています。通話の月間平均も取得できますか? 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 では、集計関数を 2 レベルまでネストすることができます。これを使用して、次のいずれかを実行することで月平均を取得でき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 は datetime 列であると想定しているため、さまざまな手法を使用してこれらのグループを分離し、DATE_FORMAT コマンドを使用して毎日、毎週、および毎月のグループを取得できます。これらのバリエーションを GROUP BY に使用すると、AVG と COUNT が期待どおりに機能します。

また、特別な方法でグループを分離する (週末から週を分離する) ために、三項 IF() 関数で実行できる多くのトリックがあります。

于 2013-06-12T02:06:26.210 に答える