Exemplu: Sa se scrie o interogare care afisaza numele departamentelor
si totalul salariilor pentru acele departamente al cãror
total pentru salarii este mai mare decat media salariilor pe toate
departamentele.
Rezolvarea acestei probleme ar solicita urmatoarele calcule intermediare:
- calculul totalului salariilor pentru fiecare departament si memorarea
rezultatului utilizand clauza WITH
- calculul mediei salariilor pentru toate departamentele
si memorarea rezultatului cu ajutorul clauzei WITH
- se compara totalul salariilor calculat in primul pas cu
media salariilor calculata in pasul doi. Daca totalul salariilor
pentru un anumit departament este mai mare decat salariul mediu
se va afisa numele departamentului si totalul salariilor pentru acel
departament
WITH
dept_costs AS (
SELECT d.department_name. SUM(e.salary) AS dept_total
FROM employees e, departments d
WHERE e.department_id=d.department_id
GROUP BY d.department_name),
avg_cost AS (
SELECT SUM(dept_total)/count (*) AS dept_avg
FROM dept_costs)
SELECT *
FROM dept_costs
WHERE dept_total >
(SELECT dept_avg
FROM avg_cost)
ORDER BY department_name;
Observatii:
- clauza WITH se utilizraza numai cu fraze SELECT
- un nume de interogare este vizibil tuturor elementelor
blocurilor de interogare definite dupã el, precum si blocului
de interogare principal (inclusiv subinterogarilor sale).
- clauza WITH poate pastra mai multre interogari separate prin
virgula.