我有这段代码:
SELECT username, first_name, last_name, NVL(salary,0) "salary"
FROM customer
WHERE NVL(salary,0) < AVG(NVL(salary, 0));
试图找出哪些用户的工资低于平均水平而一个用户没有工资(&#34; null&#34;我必须将其转换为0)。
最后一句话&#34; avg(nvl(薪水,0))&#34;没有工作,我不能为我的生活找出原因。如果我用平均值的实际数字替换语句,一切正常。
答案 0 :(得分: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
它可以很容易地显示所有工资的平均值,如果有的话。
答案 1 :(得分:2)
您可以尝试预先选择平均值:
select username,first_name,last_name,nvl(salary,0) "salary"
from customer
where nvl(salary,0) < (select avg(nvl(salary,0)) from customer);
您只能在avg
和select
条款中使用having
,这就是您出错的原因。
也不要使用nvl
,而是使用coalesce
代替,这对大数据来说应该更快。
答案 2 :(得分:0)
parentItem.Add("Child Item", templateItem);
这很容易获得。