【问题标题】:Find value smaller than average in Oracle SQL在 Oracle SQL 中查找小于平均值的值
【发布时间】:2015-09-07 21:29:23
【问题描述】:

我有这个代码:

SELECT username, first_name, last_name, NVL(salary,0) "salary"
FROM customer
WHERE NVL(salary,0) < AVG(NVL(salary, 0));

试图找出哪些用户的薪水低于平均水平,而一个用户没有薪水(“null”,我必须将其转换为 0)。

最后一条语句“avg(nvl(salary,0))”不起作用,我终其一生都无法弄清楚原因。如果我用实际的平均数替换语句,一切正常。

【问题讨论】:

  • 定义“不起作用”。您是否收到错误消息 - 如果是,它是什么?查询是否运行但提供了错误的结果?
  • 您需要在子查询中选择平均值并将此结果与实际工资进行比较
  • 我收到此错误消息:“00934. 00000 - “此处不允许使用群组功能””

标签: sql oracle average


【解决方案1】:

这是一个使用解析函数的方法:

select username,
       first_name,
       last_name,
       salary
from   (select username,
               first_name,
               last_name,
               nvl(salary,0) salary,
               avg(nvl(salary,0)) over () avg_all_salaries
        from   customer)
where  salary < avg_all_salaries

如果出现这种情况,还可以轻松显示所有工资的平均值。

【讨论】:

  • 好吧,我个人认为这个例子是一个小查询的不必要的爆炸。如果您以后真的想使用/显示avg,您可以将我的示例中的子查询重新定位到with 子句并在customer 表上进行连接。这有助于避免像您在此示例中看到的那样一次又一次地重复所有字段
  • 这个答案更好,因为它只需要通过表一次,而不是您的带有子查询的变体。性能总是比查询大小更重要。
  • 在某些版本的内存管理中,分析函数有可能不是最佳的,如果你在分析函数中进行分区,你可以进入交换区域。不是在这种情况下,但值得牢记。
【解决方案2】:

您可以尝试预先选择平均值:

select username,first_name,last_name,nvl(salary,0) "salary"
from customer
where nvl(salary,0) < (select avg(nvl(salary,0)) from customer);

您只能在selecthaving 子句中使用avg,这就是您出错的原因。

也不要使用nvl,而是使用coalesce,这在大数据上应该更快。

【讨论】:

  • 非常感谢。完美运行
  • 在这种情况下,我认为您不会看到 coalesce 和 nvl 之间有太大区别,但是使用 coalesce 将是未来用例的好习惯。
  • @DavidAldridge 如果你有一个关于工资和客户数量的指数是 1Mi+ 怎么办?
  • @smnbbrv 如果你有一个关于 Nvl(salary,0) 或 Coalesce(salary,0) 的索引,你的意思是什么?或者可能在 (salary , 0) 上——我认为薪水索引在这里不会做任何事情,但老实说,我认为这些表达式的索引也没有好处。也许我误解了你的意图。
  • index on customer(salary) - 这不会与nvl 一起使用,但会与coalesce 一起使用。
【解决方案3】:
SELECT username,first_name,last_name, NVL(salary,0) "salary"
FROM customer
WHERE NVL(salary,0) < (SELECT AVG(NVL(salary,0)) FROM customer);

这很容易获得。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-12
    • 2022-10-26
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多