Sql NVL函数没有';我不能正常工作

Sql NVL函数没有';我不能正常工作,sql,database,plsql,Sql,Database,Plsql,我应该做的脚本,应该计算每月的平均费用。 在下面的屏幕截图中,您可以看到我应该收到的平均值 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:    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;

你帖子中的图片没有显示,所以我看不出问题出在哪里。您可能希望对图像使用JPEG而不是PNG,因为并非所有系统和浏览器都能成功显示PNG。谢谢。最好使用纯文本。问题是十二月的子查询没有返回任何行,因此联合的结果只有2行,而不是3行。仍然无法看到图像。正如@Barmar所建议的,最好将您的期望值作为文本包含,而不是尝试在图像中链接。您是否有一个日历表,每个日期都有一行?这将使处理没有数据的年-月变得容易得多。它给了我以下错误:ORA-00923:FROM关键字未在预期位置找到。我试图纠正它,但我不知道从哪里开始。此部分中缺少FROM-右联接(选择'201210'月UNION选择'201211'UNION选择'201212')抱歉,我已经习惯MySQL,它不需要表。PLSQL使用DUAL,我已经添加了它。感谢您的帮助,但是费用并没有除以月份,因为月份是零值的。我为12月份运行select,没有返回任何记录。另一个问题是
op
在这些月份为空,因此
groupby op
会将它们过滤掉。