bedingte Reihenfolge nach Klausel in SQL

Ich habe eine Abfrage, die das Ergebnis in asc oder desc abhängig von einem Spaltenwert bestellen sollte.

z.B

Wenn ein Mitarbeiter vom Typmanager existiert DANN Auftrag von joining_date, bith_date ASC sonst, wenn Mitarbeiter Entwickler ist DANN Auftrag von joining_date, Geburtsdatum DESC.

Ich möchte etwas wie unten erreichen, aber das kann ich nicht erreichen.

ORDER BY CASE WHEN employee_type = 'm' THEN joining_date, birth_date ASC; WHEN employee_type = 'd' THEN joining_date, birth_date DESC; 

Solutions Collecting From Web of "bedingte Reihenfolge nach Klausel in SQL"

Nun, ich habe die Antwort nach ein paar Recherchen bekommen.

Wir können mehrere Spalten in where-Klausel bedingt wie folgt hinzufügen:

 ORDER BY DECODE(employee_type, 'm', joining_date, birth_date, salary) ASC, DECODE(employee_type, 'd', joining_date, birth_date, salary) DESC 

Dies ordnet das Ergebnis auf der Grundlage von employee_type an.

Ich vermute, du willst etwas wie dieses:

 ORDER BY employee_type DESC -- first all the managers, then the developers -- and in every one of these two groups , joining_date -- first order by joining date , CASE WHEN employee_type = 'm' -- and then either by THEN birth_date -- birth date ascending for managers ELSE NULL END -- or , birth_date DESC ; -- birth date descending for the rest (devs) 

Die Frage ist ein bisschen schlecht spezifiziert.

Ordne das Ergebnis abhängig von einem Spaltenwert in asc oder desc an.

Eine Spalte benötigt viele Werte (da es mehrere Zeilen gibt).

Jetzt order by Klausel order by verwenden Sie einen Ausdruck und Reihenfolgen. Dieser Ausdruck sollte morphotrop sein (;))

In Anlehnung an das Mitarbeiterschema von stardard oracle sind Manager also:

 select * from emp e where exists (select emp_id from emp where e.id=emp.mgr_id) 

Eine Problemumgehung-Abfrage kann sein:

 Select e.id, e.name, e.birth_date, case when (select count(*) from emp e where exists (select emp_id from emp where e.id=emp.mgr_id) ) --existence of manager > 0 then birth_date - to_date('1-Jan-1000','dd-mon-yyyy') else to_date('1-Jan-1000','dd-mon-yyyy') - birth_date end as tricky_expression from emp A order by 4; 

Diese Äußerung ist der case ; Unter Verwendung einer Konstante (Unterabfrage, die entscheidet, dass es Manager gibt) ändert sie Werte von positiv zu negativ, dh ändert die Reihenfolge.

UPDATE: mit den Details in den Kommentaren:

 select id, name, birth_date emp_type from ( Select id, name, birth_date, emp_type, case when cnt_mgr > 0 then birth_date - to_date('1-Jan-1000','dd-mon-yyyy') else to_date('1-Jan-1000','dd-mon-yyyy') - birth_date end as tricky_expression from( Select e.id, e.name, e.birth_date, emp_type, count(case when emp_type='M' then 1 else 0 end) over() as mgr_count from emp A where your_conditions ) order by tricky_expression ) where rownum=1; 

Wenn es einen Manager im Unternehmen gibt, gibt diese Abfrage den ältesting Manager zurück, andernfalls – der jüngste Entwickler.

 select id, name, birth_date, emp_type from emp where id = (select max(id) keep (dense_rank first order by decode(emp_type, 'M', 1, 'D', 2), joining_date, decode(emp_type, 'M', 1, 'D', -1) * (birth_date - to_date('3000','yyyy'))) from emp)