Sql 没有给出预期的结果
运行查询时:Sql 没有给出预期的结果,sql,subquery,average,aggregate-functions,distinct,Sql,Subquery,Average,Aggregate Functions,Distinct,运行查询时: ID FirstName LastName Gender Salary 1 Ben Hoskins Male 70000 2 Mark Hastings Male 60000 4 Ben Hoskins Male 70000 8 John Stanmore Male 80000 它显示了7000条的2条记录,应该显示一条。如果我使用了dis
ID FirstName LastName Gender Salary
1 Ben Hoskins Male 70000
2 Mark Hastings Male 60000
4 Ben Hoskins Male 70000
8 John Stanmore Male 80000
它显示了7000条的2条记录,应该显示一条。如果我使用了distinct,为什么它会显示两条记录?看起来表中有重复的行(只因其
id
不同),因此我假设您希望在姓名、性别和薪资上distinct
,而不仅仅是薪资
在外部查询和内部查询中,您似乎都希望不同的:
select *
from Employees
where Salary > (SELECT AVG(distinct SALARY) FROM employees)
如果您的数据库支持窗口功能,则可以缩短:
select distinct firstname, lastname, gender, salary
from employees
where salary > (
select avg(salary)
from (
select distinct firstname, lastname, gender, salary
from employees
) e
)
表中似乎有重复的行(仅因其id
不同),因此我假设您希望在名称、性别和薪资上有的差异,而不仅仅是薪资
在外部查询和内部查询中,您似乎都希望不同的:
select *
from Employees
where Salary > (SELECT AVG(distinct SALARY) FROM employees)
如果您的数据库支持窗口功能,则可以缩短:
select distinct firstname, lastname, gender, salary
from employees
where salary > (
select avg(salary)
from (
select distinct firstname, lastname, gender, salary
from employees
) e
)
您在子查询中使用了distinct
,而不是在外部查询中,因此外部查询仍然可以看到包含重复项的数据
您可以使用以下方法解决此问题:
select *
from (
select e.*, avg(salary) over() as avg_salary
from (
select distinct firstname, lastname, gender, salary
from employees
) e
) e
where salary > avg_salary
但是,如果您的行中有这样的重复项,那么数据模型似乎有严重的问题。数据应该是固定的
同时,你可以解决这个问题。您可以使用消除重复项的CTE来表达查询:
select e.FirstName, e.LastName, e.Gender, e.Salary
from Employees e
where e.Salary > (SELECT AVG(distinct e2.SALARY) FROM employees e2);
您在子查询中使用了distinct
,而不是在外部查询中,因此外部查询仍然可以看到包含重复项的数据
您可以使用以下方法解决此问题:
select *
from (
select e.*, avg(salary) over() as avg_salary
from (
select distinct firstname, lastname, gender, salary
from employees
) e
) e
where salary > avg_salary
但是,如果您的行中有这样的重复项,那么数据模型似乎有严重的问题。数据应该是固定的
同时,你可以解决这个问题。您可以使用消除重复项的CTE来表达查询:
select e.FirstName, e.LastName, e.Gender, e.Salary
from Employees e
where e.Salary > (SELECT AVG(distinct e2.SALARY) FROM employees e2);
请用你正在运行的数据库标记你的问题:mysql、oracle、postgres…?你的目标是什么,如果你想只显示那些拿平均工资以上的人,为什么要使用distinct?请用你正在运行的数据库标记你的问题:mysql、oracle、postgres…?你的目标是什么,ı如果您只想向那些收入高于平均工资的人展示,为什么要使用distinct?