0

1 か月あたりの平均料金を計算するスクリプトを実行することになっています。以下のスクリーン ショットでは、受け取るべき平均値を確認できます。

OP_Yearly           
         counter charge minutes
Oct 2012    1   5.16    1.32
Nov 2012    1   54.44   14.42
Dec 2012    0   0.00    0.00

    Average:    19.86464    5.246666667

ただし、問題は、この平均値を受け取ることです。請求額は、値がゼロの月で割られていません。

OP_Yearly           
         counter charge minutes
Oct 2012    1   5.16    1.32
Nov 2012    1   54.44   14.42
Dec 2012    0   0.00    0.00

    Average:    29.79696    7.87

これは私のスクリプトです -

   SELECT op,
       SUM (counter) AS counter,
       AVG (NVL (Charge_SDR, 0)) AS AVERAGE_CHARGE_SDR_YTD,
       AVG (NVL (Minutes, 0)) AS AVERAGE_MINUTES_YTD
  FROM (
  SELECT t.op AS op,
           COUNT (DISTINCT t.im) AS counter,
           (SUM (t.charge / POWER (10, t.decimals))) AS Charge_SDR,
           CAST (SUM (t.duration / 60) AS NUMBER (10, 2)) Minutes
      FROM top t, oper o
     WHERE t.op = o.op AND timestamp LIKE '201210%' AND o.TYPE = 'M'
GROUP BY t.op,
UNION ALL
  SELECT t.op AS op,
         COUNT (DISTINCT t.im) AS counter,
         (SUM (t.charge / POWER (10, t.decimals))) AS Charge_SDR,
         CAST (SUM (t.duration / 60) AS NUMBER (10, 2)) Minutes
    FROM top t, oper o
   WHERE t.op = o.op AND timestamp LIKE '201211%' AND o.TYPE = 'M'
GROUP BY t.op,
UNION ALL
  SELECT t.op AS op,
         COUNT (DISTINCT t.im) AS counter,
         (SUM (t.charge / POWER (10, t.decimals))) AS Charge_SDR,
         CAST (SUM (t.duration / 60) AS NUMBER (10, 2)) Minutes
    FROM top t, oper o
   WHERE t.op = o.op AND timestamp LIKE '201212%' AND o.TYPE = 'M'
GROUP BY t.op, )
GROUP BY op;

3ヶ月で割る(sum(Charge_SDR)/3)と簡単に作れますが、NVL関数でのやり方が知りたいです。スクリプト NVL に含めましたが、値がゼロの今月はキャッチされません。それを修正する方法はありますか?事前に助けてくれてありがとう

4

1 に答える 1

0

サブクエリは、レコードがゼロの月の行を返しません。月のリストで外部結合を使用して、NULL 行を作成します。

SELECT op,
       SUM (counter) AS counter,
       AVG (NVL (Charge_SDR, 0)) AS AVERAGE_CHARGE_SDR_YTD,
       AVG (NVL (Minutes, 0)) AS AVERAGE_MINUTES_YTD
FROM (
  SELECT t.op AS op,
         SUBSTR(timestamp, 1, 6) AS month,
         COUNT (DISTINCT t.im) AS counter,
         (SUM (t.charge / POWER (10, t.decimals))) AS Charge_SDR,
         CAST (SUM (t.duration / 60) AS NUMBER (10, 2)) Minutes
    FROM top t, oper o
   WHERE t.op = o.op AND timestamp LIKE '201210%' AND o.TYPE = 'M'
GROUP BY t.op,
UNION ALL
  SELECT t.op AS op,
         SUBSTR(timestamp, 1, 6) AS month,
         COUNT (DISTINCT t.im) AS counter,
         (SUM (t.charge / POWER (10, t.decimals))) AS Charge_SDR,
         CAST (SUM (t.duration / 60) AS NUMBER (10, 2)) Minutes
    FROM top t, oper o
   WHERE t.op = o.op AND timestamp LIKE '201211%' AND o.TYPE = 'M'
GROUP BY t.op,
UNION ALL
  SELECT t.op AS op,
         SUBSTR(timestamp, 1, 6) AS month,
         COUNT (DISTINCT t.im) AS counter,
         (SUM (t.charge / POWER (10, t.decimals))) AS Charge_SDR,
         CAST (SUM (t.duration / 60) AS NUMBER (10, 2)) Minutes
    FROM top t, oper o
   WHERE t.op = o.op AND timestamp LIKE '201212%' AND o.TYPE = 'M') t
RIGHT JOIN (SELECT '201210' month
            FROM dual
            UNION SELECT '201211'
            FROM dual
            UNION SELECT '201212'
            FROM dual) m
ON t.month = m.month
GROUP BY op;
于 2013-11-07T14:51:24.980 に答える