Sql 2012简化查询联盟

Sql 2012 Simplify Query Union

我最近找到了一份新工作,我正在尝试简化一些遗留的旧查询,但我终究无法弄清楚如何使用 union 将其分解为两个查询。一定有办法,但我无法简化比我拥有的更多。

    select  (
    select avg (Employee.salary)
    from Employee left join Job_title
    on Employee.job_title = Job_title.Job_title
    where Employee.Exempt_Non_Exempt_Status='0'
    group by Employee.Exempt_Non_Exempt_Status
    ) as AverageSalary, 'Non-Exempt' as Status
    ,       (
    select MIN (Employee.salary)
    from Employee left join Job_title
    on Employee.job_title = Job_title.Job_title
    where Employee.Exempt_Non_Exempt_Status='0'
    group by Employee.Exempt_Non_Exempt_Status
    ) as MinimumSalary, 'Non-Exempt' as Status
    ,       (
    select MAX (Employee.salary)
    from Employee left join Job_title
    on Employee.job_title = Job_title.Job_title
    where Employee.Exempt_Non_Exempt_Status='0'
    group by Employee.Exempt_Non_Exempt_Status
    ) as MaximumSalary, 'Non_Exempt' as Status
 UNION
    select  (
    select avg (Employee.salary)
    from Employee left join Job_title
    on Employee.job_title = Job_title.Job_title
    where Employee.Exempt_Non_Exempt_Status='1'
    group by Employee.Exempt_Non_Exempt_Status
    ) as AverageSalary, 'Exempt' as Status
    ,       (
    select MIN (Employee.salary)
    from Employee left join Job_title
    on Employee.job_title = Job_title.Job_title
    where Employee.Exempt_Non_Exempt_Status='1'
    group by Employee.Exempt_Non_Exempt_Status
    ) as MinimumSalary, 'Exempt' as Status
    ,       (
    select MAX (Employee.salary) 
    from Employee left join Job_title
    on Employee.job_title = Job_title.Job_title
    where Employee.Exempt_Non_Exempt_Status='1'
    group by Employee.Exempt_Non_Exempt_Status
    )as MaximumSalary, 'Exempt' as Status

您应该可以这样做:

select min(salary), max(salary), avg(salary), 'Non-Exempt' as otherThingy
from (
    select Employee.salary
    from Employee left join Job_title
    on Employee.job_title = Job_title.Job_title
    where Employee.Exempt_Non_Exempt_Status='0'
) thingy
UNION
select min(salary), max(salary), avg(salary), 'Exempt' as otherThingy
from (
    select Employee.salary
    from Employee left join Job_title
    on Employee.job_title = Job_title.Job_title
    where Employee.Exempt_Non_Exempt_Status='1'
) thingy

或者如果你真的很喜欢,你最有可能一次完成所有的事情:

http://sqlfiddle.com/#!6/8b437/1

select 
    min(salary), 
    max(salary), 
    avg(salary), 
    case when Exempt_Non_Exempt_Status = 0 
        then 'Non-Exempt' 
        else 'Exempt' 
    end as exemptStatus
from (
    select Employee.salary, Exempt_Non_Exempt_Status
    from Employee
) thingy
group by Exempt_Non_Exempt_Status

由于您只在每个子查询中选择 1 个字段,因此不需要 "Group By"。此外,根据数据,您可能不需要 link 在 Job_title Table.

如果您需要 Job_title table 那么...

SELECT Min(salary), Max(salary), Avg(salary), 'Non-Exempt' AS Status 
FROM   (SELECT employee.salary 
        FROM   employee 
                LEFT JOIN job_title  ON employee.job_title = job_title.job_title 
        WHERE  employee.exempt_non_exempt_status = '0') 
UNION 
SELECT Min(salary), Max(salary), Avg(salary), 'Exempt' AS Status 
FROM   (SELECT employee.salary 
        FROM   employee 
               LEFT JOIN job_title 
                      ON employee.job_title = job_title.job_title 
        WHERE  employee.exempt_non_exempt_status = '1') 

如果您不需要 Job_title 中的 link(因为您没有在任何地方使用它)那么...

SELECT Min(salary), Max(salary), Avg(salary), 'Non-Exempt' AS Status 
FROM   (SELECT employee.salary 
        FROM   employee 
        WHERE  employee.exempt_non_exempt_status = '0') 
UNION 
SELECT Min(salary), Max(salary), Avg(salary), 'Exempt' AS Status 
FROM   (SELECT employee.salary 
        FROM   employee 
        WHERE  employee.exempt_non_exempt_status = '1') 

感谢大家的快速响应。这是我使用的代码。我能够使用提供的所有代码获得相同的结果,并感谢大家。

SELECT Min(salary) as 'Minimum Salary', Max(salary) as 'Maximum Salary',Avg(salary) as 'Average Salary', 'Non-Exempt' AS Status 
FROM   (SELECT employee.salary 
    FROM   employee 
    WHERE  employee.exempt_non_exempt_status = '0') thingy1
UNION 
SELECT Min(salary) as 'Minimum Salary', Max(salary) as 'Maximum Salary', Avg(salary) as 'Average Salary', 'Exempt' AS Status 
FROM   (SELECT employee.salary 
    FROM   employee 
    WHERE  employee.exempt_non_exempt_status = '1') thingy2