2016-04-05 8 views
0

empと呼ばれるテーブルがあり、私は最も低い賃金のClerkを探しています。私のコードselect min(sal) as min from emp where job='CLERK';は正常に動作し、私はこれを取得:従業員の名前SQLと一緒にmin(sal)を検索します。Oracle

MIN 
---------- 
     800 

私もSmithある店員の名前を表示したいです。私がこのコードselect ename, min(sal) as min from emp where job='CLERK' group by name;を実行すると、それは私にテーブルの中のすべての書記官を与えます。それは本当に私が欲しいとは思っていません。ここに私のテーブルの抜粋です:

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); 
+0

あなたの質問はサンプルデータで明確にする必要がありますしてみてください。あなたは1) 'スミスクラーク900' 2) 'ジョンクラーク500' 3) 'スミスクラーク1000 ' –

答えて

1

この

SELECT * FROM emp 
WHERE SAL = (select MIN(SAL) sal from emp WHERE JOB ='CLERK') 
and JOB ='CLERK'; 
+0

ありがとうございました。 – user3395936

0

あなたは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 
0

あなたがサブクエリとランキング機能でこれを行うことができます。

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; 

これは、複数の行を返します。もし紐があれば。 1つしか必要ない場合はdense_rank()の代わりにrow_number()を使用できます。

そして、あなたは単一の区切り値として、すべての事務員の名前をしたい場合、あなたは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; 
関連する問題