查找 min(sal) 以及员工姓名 SQL Oracle
Find min(sal) along with employee name SQL Oracle
我有 table 打电话给 emp
,我正试图找到薪水最低的文员。我的代码 select min(sal) as min from emp where job='CLERK';
工作正常,我得到这个:
MIN
----------
800
但我还想显示店员的姓名 Smith
。当我 运行 这个代码 select ename, min(sal) as min from emp where job='CLERK' group by name;
它给了我 table 中的所有文员,这不是我想要的。这是我的 table:
的片段
CREATE TABLE EMP
(EMPNO NUMBER(4) NOT NULL,
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(4),
HIREDATE DATE,
SAL NUMBER(7, 2),
COMM NUMBER(7, 2),
DEPTNO NUMBER(2));
INSERT INTO EMP VALUES
(7369, 'SMITH', 'CLERK', 7902,
TO_DATE('17-DEC-1980', 'DD-MON-YYYY'), 800, NULL, 20);
INSERT INTO EMP VALUES
(7499, 'ALLEN', 'SALESMAN', 7698,
TO_DATE('20-FEB-1981', 'DD-MON-YYYY'), 1600, 300, 30);
您可以使用 row_number
:
select ename, sal as min
from (
select ename, sal,
row_number() over (order by sal) as rn
from emp
where job='CLERK' ) t
where t.rn = 1
您可以使用子查询和排名函数来做到这一点:
select e.*
from (select e.*,
dense_rank() over (partition by job order by salary) as seqnum
from emp
where job = 'CLERK'
) e
where seqnum = 1;
如果有联系,这将 return 多行。如果你只想要一个,你可以使用 row_number()
而不是 dense_rank()
。
并且,如果您希望所有职员的姓名作为单个分隔值,则可以使用 list_agg()
:
select listagg(e.name, ', ') within group (order by e.name) as names
from (select e.*,
dense_rank() over (partition by job order by salary) as seqnum
from emp
where job = 'CLERK'
) e
where seqnum = 1;
试试这个
SELECT * FROM emp
WHERE SAL = (select MIN(SAL) sal from emp WHERE JOB ='CLERK')
and JOB ='CLERK';
我有 table 打电话给 emp
,我正试图找到薪水最低的文员。我的代码 select min(sal) as min from emp where job='CLERK';
工作正常,我得到这个:
MIN
----------
800
但我还想显示店员的姓名 Smith
。当我 运行 这个代码 select ename, min(sal) as min from emp where job='CLERK' group by name;
它给了我 table 中的所有文员,这不是我想要的。这是我的 table:
CREATE TABLE EMP
(EMPNO NUMBER(4) NOT NULL,
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(4),
HIREDATE DATE,
SAL NUMBER(7, 2),
COMM NUMBER(7, 2),
DEPTNO NUMBER(2));
INSERT INTO EMP VALUES
(7369, 'SMITH', 'CLERK', 7902,
TO_DATE('17-DEC-1980', 'DD-MON-YYYY'), 800, NULL, 20);
INSERT INTO EMP VALUES
(7499, 'ALLEN', 'SALESMAN', 7698,
TO_DATE('20-FEB-1981', 'DD-MON-YYYY'), 1600, 300, 30);
您可以使用 row_number
:
select ename, sal as min
from (
select ename, sal,
row_number() over (order by sal) as rn
from emp
where job='CLERK' ) t
where t.rn = 1
您可以使用子查询和排名函数来做到这一点:
select e.*
from (select e.*,
dense_rank() over (partition by job order by salary) as seqnum
from emp
where job = 'CLERK'
) e
where seqnum = 1;
如果有联系,这将 return 多行。如果你只想要一个,你可以使用 row_number()
而不是 dense_rank()
。
并且,如果您希望所有职员的姓名作为单个分隔值,则可以使用 list_agg()
:
select listagg(e.name, ', ') within group (order by e.name) as names
from (select e.*,
dense_rank() over (partition by job order by salary) as seqnum
from emp
where job = 'CLERK'
) e
where seqnum = 1;
试试这个
SELECT * FROM emp
WHERE SAL = (select MIN(SAL) sal from emp WHERE JOB ='CLERK')
and JOB ='CLERK';