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?