一次查询中包含员工姓名的最大和最小萨尔

问题描述 投票:0回答:6

我正在处理一个 SQL 查询。

表名:

employees
.

我想在 SQL 中获取

MAX
MIN
sal 及其员工姓名。

我知道如何使用

MAX
MIN
。但我们怎样才能在一个查询中同时完成这两项任务呢?

我需要如下所示的单行输出:

e1.name AS MaxName, MAX(e1.sal) AS MaxSalary, e2.name AS MinName, MIN(e2.sal) AS MinSalary
sql oracle oracle11g oracle10g
6个回答
1
投票

单选:

SELECT  MIN( salary ) AS MinSalary,
        MIN( name ) KEEP ( DENSE_RANK FIRST ORDER BY salary ASC ) AS MinName,
        MAX( Salary ) AS MaxSalary,
        MAX( name ) KEEP ( DENSE_RANK LAST ORDER BY salary ASC ) AS MaxName
FROM    Employees;

1
投票

两种方式:

使用分析功能:

SQL> SELECT  MIN(ename) KEEP (DENSE_RANK FIRST ORDER BY sal) min_name,
  2          MIN(sal) AS min_sal,
  3          MAX(ename) KEEP (DENSE_RANK LAST ORDER BY sal) AS max_name,
  4          MAX(sal) AS max_sal
  5  FROM    emp;

MIN_NAME      MIN_SAL MAX_NAME      MAX_SAL
---------- ---------- ---------- ----------
SMITH             800 KING             5000

使用内联视图

SQL> WITH DATA AS
  2    ( SELECT MIN(sal) min_sal, MAX(sal) max_sal FROM emp
  3    )
  4  SELECT
  5    (SELECT e.ename FROM DATA t, emp e WHERE e.sal = t.min_sal AND ROWNUM =1
  6    ) min_name,
  7    (SELECT t.min_sal FROM DATA t, emp e WHERE e.sal = t.min_sal AND ROWNUM =1
  8   ) min_sal,
  9    (SELECT e.ename FROM DATA t, emp e WHERE e.sal = t.max_sal AND ROWNUM =1
 10   ) max_name,
 11    (SELECT t.max_sal FROM DATA t, emp e WHERE e.sal = t.max_sal AND ROWNUM =1
 12   ) max_sal
 13     FROM dual;

MIN_NAME      MIN_SAL MAX_NAME      MAX_SAL
---------- ---------- ---------- ----------
SMITH             800 KING             5000

0
投票

假设您正在使用 Oracle,请尝试此操作。首先,我们按升序和降序获取行号,然后进行交叉连接。

with employee(id,name,sal) as
(select 1,'a',1000 from dual union all
select 3,'c',1500 from dual union all
select 2,'b',2000 from dual)   --temp table to recreate the scenario
, enew as(
select e.*,row_number() over (order by sal) as salasc,row_number() over (order by sal desc) as saldesc from employee e
) --temp table to find the rownumber in ascending and descending order
--original query
select * from (select id as minsalid,name as minsalempname,sal as minsal from enew
where salasc=1)
cross join
(select id as maxsalemp,name as maxsalempname,sal as maxsal from enew
where saldesc=1)

0
投票

以下解决方案适用于 MySQL,这是您发布问题时最初拥有的标签之一。

您可以针对自身执行

CROSS JOIN
表的
employees
,以通过查找最小姓名/薪水的查询来查找最大姓名/薪水。

SELECT e1.name AS MaxName, MAX(e1.sal) AS MaxSalary,
    e2.name AS MinName, MIN(e2.sal) AS MinSalary
FROM employees e1 CROSS JOIN employees e2

单击下面的链接查看正在运行的演示。我实际上包含了姓名/工资对,但如果您不希望这些姓名出现,您可以将其删除。

SQLFiddle


0
投票

尝试类似:

select max(sal), min(sal), employee_id 
from employees
group by employee_id;

之后你就可以加入它来获取名字了。也许您也可以按名称和 ID 进行分组。


0
投票
with min_max_age as
  (
    select dept,
    min(age) as  min_Age,
    max(age) as max_age
    from Employees
    group by dept
  )
select a.name, a.dept, a.age from Employees a join min_max_age b
on (a.age = b.min_Age and a.dept = b.dept)
or (a.age = b.max_age and a.dept = b.dept)
© www.soinside.com 2019 - 2024. All rights reserved.