繁体   English   中英

NVL功能无法正常使用

[英]NVL function doesn't work properly

我应该执行脚本来计算每月的平均费用。 在下面的屏幕快照中,您可以看到我应该收到的平均值。

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包含在内,但本月没有捕获到该脚本,该脚本的值为零。 任何想法如何纠正它? 感谢您提前帮助我

您的子查询不会返回记录为零的月份的行。 使用带有月份列表的外部联接为它们创建空行。

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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM