2016-04-05 12 views
0

Ich habe Tabelle emp genannt und ich versuche, die am schlechtesten bezahlten Clerk zu finden. Mein Code select min(sal) as min from emp where job='CLERK'; funktioniert gut und ich bekomme diese:Finden Sie min (sal) zusammen mit Mitarbeitername SQL Oracle

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

aber ich mag auch den Namen des Schreiber zeigen, die Smith ist. Wenn ich diesen Code select ename, min(sal) as min from emp where job='CLERK' group by name; ausführen, gibt es mir alle Clerks in der Tabelle, die ich nicht wirklich will. Hier ist ein Ausschnitt aus meinem Tisch:

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

Sie Frage Klärung mit Beispieldaten benötigt. Was ist das Ergebnis in dem Fall Sie haben 1) 'Smith Schreiber 900' 2) 'Jhon Schreiber 500' 3)' Smith Schreiber 1000' –

Antwort

1

versuchen diese

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

Danke, das hat funktioniert :) – user3395936

0

können Sie verwenden 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

Sie können dies tun mit einer Unterabfrage und Ranking-Funktionen:

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; 

Dies wird mehrere Zeilen zurückgeben wenn es Krawatten gibt. Wenn Sie nur einen möchten, können Sie row_number() anstelle von dense_rank() verwenden.

Und, wenn Sie die Namen aller Angestellten als einzelne abgegrenzte Wert wollen, dann können Sie list_agg() verwenden:

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;