2015-09-07 58 views
0

我有这样的代码:发现价值

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

试图找出哪些用户拥有低于平均工资和一个用户没有工资(“零”我必须转换为0 )。

最后一句“avg(nvl(salary,0))”不起作用,我不能为了我的生活找出原因。如果我用一般的实际数字代替陈述,那么一切正常。

+0

定义“不起作用”。你是否收到错误信息 - 如果有,它是什么?查询是否运行但提供了错误的结果? –

+0

您需要选择子查询中的平均值并将此结果与实际工资进行比较 – SomeJavaGuy

+0

我收到此错误消息:“00934. 00000 - ”组功能在此处不允许“” – Mongzyy

回答

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,而是使用​​3210来代替,这对大数据来说应该会更快。

+0

非常感谢。完美作品 – Mongzyy

+0

@Shenmoe欢迎您,如果您认为可以将答案标记为“已接受” – smnbbrv

+0

我认为在这种情况下,您不会看到coalesce和nvl之间存在太大差异,但使用coalesce会是一种好习惯进入未来的使用案例。 –

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

这很容易得到。

4

下面是使用分析功能的方法:

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 

它可以很容易地也显示所有薪水的平均值,应该是有史以来出现。

+0

以及我个人认为这个例子是一个不必要的小查询爆炸。如果你真的想在稍后使用/显示'avg',你可以将我的例子中的子查询重定位到'with'子句并在'customer'表上加入。这有助于避免重复所有字段,就像你在这个例子中看到的一样 – smnbbrv

+1

这个答案更好,因为它只需要一次通过表,而不是你的变体与子查询。性能总是更重要的查询大小。 – Stawros

+0

在某些版本中,内存管理并不是最佳的分析函数,并且如果在分析函数中进行分区,则可以进入交换区域。不是在这种情况下,但值得记住。 –