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ürde

    select 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.


Anmelden zum Antworten