Maksymalna i minimalna wartość z sumy - ORACLE

0

Hej wszystkim!
mam problem ze zbudowaniem zapytania, które będzie zwracać nazwę działu, w którym pracownicy zarabiają sumarycznie najwięcej oraz nazwę działu, w którym zarabiają sumarycznie najmniej.
Zwracane wyniki mam zapisać w jednym zdaniu: Pracownicy zarabiaja najwiecej w dziale ... a najmniej w dziale.... a różnica wynosi ...

Napisałem zapytanie które zwraca mi nazwę działu zarabiającego najwięcej oraz najmniej lecz nie wiem jak zapisać wynik w postaci jednego zdania oraz zwrócić różnicę.

SELECT *
from (select d.dname, sum(e.sal) suma from emp e join dept d on e.deptno=d.deptno
group by d.dname order by suma desc)
where rownum<=1
UNION
SELECT *
from (select d.dname, sum(e.sal) suma from emp e join dept d on e.deptno=d.deptno
group by d.dname order by suma asc)
where rownum<=1
;

Może ktoś podpowiedziałby sposób jak to zrobić??
Byłoby łatwo jakby dało się użyć MAX(SUM(sal)), ale tak nie działa :/

0

Jedno z rozwiązań podałem tutaj : Zadanie z funkcjami.
Co prawda na przykłądzie SQL Server, ale w Oracle możesz zrobić analogicznie.

0

W podanym przez Ciebie przykładzie jest tylko pokazane jak znaleźć wartość max i min, ale nie wiem jak użyć w przypadku kiedy te wartości chcę wyznaczyć z sumy zarobków dla danego działu? Zauważ że muszę też gdzieś użyć funkcji sum, a później działam już na wyniku tej funkcji

0

A w którym momencie w podanym przez Ciebie przykładzie powinienem użyć złączenia, gdyż nazwę działu biorę z tabeli dept, a zarobki są w tabeli emp?

0

Chyba najmniej tłumaczenia i najprościej jak zrobisz ze swojego przykładu CROSS JOINA czyli przerób UNION na JOIN dwóch tabel MIN i MAX :

SELECT -- tu będziesz mial dostęp do wszystkich kolumn które potrzebujesz aby złączyć odpowiedni string
FROM ( MIN query 1 - zwraca jeden rekord ) , ( MAX query 2 - też zwraca 1 rekord)

pozdr

0

Dzięki za podpowiedź. Wieczorem spróbuję zrobić tak jak napisałeś i dam znać czy zadziałało.

1

Zadziałać zadziała :) z jedną uwagą którą opisałem we wcześniejszym poście. W tej uproszczonej wersji zwrócone zostaną po jednym rekordzie (losowym w dziedzinie MIN/ MAX suma). I teraz wyjątek, gdy nie będzie to prawidłowe rozwiązanie - może być tak, że wartości minimalnych będziesz miał kilka (identyczne minimalne sumy dla różnych działów) lub to samo z maksem to wtedy proponuję rozwiązanie z podzapytaniami skorelowanymi, joinowaniem z wartością MIN/MAX lub takie jak opisałem w nam przykładzie wartości zleceń.

0

SET SERVEROUTPUT ON
declare
v_minsum varchar(30);
v_maxsum varchar(30);
v_diference number;

begin

SELECT * INTO v_minsum

FROM (SELECT d.dname FROM emp e Join dept d on e.deptno=d.deptno
Group By d.dname ORDER BY sum(e.sal) DESC)
WHERE ROWNUM<=1;

SELECT * INTO v_maxsum

FROM (SELECT d.dname FROM emp e JOIN dept d on e.deptno=d.deptno
GROUP BY d.dname ORDER BY sum(e.sal) ASC)
WHERE ROWNUM<=1;

SELECT MAX(SUM(e.Sal)) - MIN(SUM(e.Sal)) INTO v_diference

FROM Emp e LEFT JOIN Dept d ON e.Deptno = d.Deptno
GROUP BY d.Dname;

DBMS_OUTPUT.put_line('Pracownicy zarabiają najwięcej w dziale '||v_maxsum||', a najmniej w dziale '||v_minsum||'. Różnica wynosi '||v_diference);

end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1