having by alias
-
Hallo Zusammen,
habe folgende Aufgabenstellung.--Alle Abteilungen in denen man durschnittlich zwischen 2000 und 4000 verdient
jetzt hatte ich zunächst folgenden Lösungsansatz:
select round(avg(e.sal),0) sal_avg, e.deptno, d.dname from emp e join dept d on e.deptno = d.deptno group by e.deptno, d.dname having sal_avg between 2000 and 4000 ;
hierbei bekomme ich aber folgenden Fehler: "SAL_AVG": ungültiger Bezeichner
Eine Funktionierende Lösung wäre:
select distinct e.deptno, d.dname from emp e join ( select round(avg(ee.sal),0) sal_avg, ee.deptno, dd.dname from emp ee join dept dd on ee.deptno = dd.deptno group by ee.deptno, dd.dname ) d on e.deptno = d.deptno where d.sal_avg between 2000 and 4000 ;
aber vom Prinzip wird hier doch ebenfalls einfach der alias sal_avg benutzt.
Gibt es eine Möglichkeit den funktionierenden Lösungsweg zu vereinfachen?
weitere Infos:
sal_avg deptno dname 2917 10 ACCOUNTING 2175 20 RESEARCH 1567 30 SALES
empno ename deptno sal 7369 SMITH 20 800 7499 ALLEN 30 1600 7521 WARD 30 1250 7566 JONES 20 2975 7654 MARTIN 30 1250 7698 BLAKE 30 2850 7782 CLARK 10 2450 7788 SCOTT 20 3000 7839 KING 10 5000 7844 TURNER 30 1500 7876 ADAMS 20 1100 7900 JAMES 30 950 7902 FORD 20 3000 7934 MILLER 10 1300
Danke für eure Hilfe
-
Bei 'HAVING' kannst du nur Parameter angeben, nach denen auch gruppiert ('GROUP BY') wurde.
Daher wirst du wohl die 2. Lösung nehmen müssen, da du ja erst den Durchschnittswert berechnen mußt, ehe du danach filtern kannst.
-
Danke für deine Antwort,
wenn ich z.B. das erste Statement folgendermaßen umformen würdeselect e.deptno, d.dname from emp e join dept d on e.deptno = d.deptno group by e.deptno, d.dname having round(avg(e.sal),0) between 2000 and 4000 ;
klappt es.
Scheint also irgendwie am Alias zu liegen.
-
Das liegt daran, dass "select" nach "having" ausgewertet wird. Demnach kennt having den Alias zu diesem Zeitpunkt nicht.