alias in having-klausel verwenden?

alias in having-klausel verwenden?

am 02.06.2007 14:03:57 von danyo

Hierbei tritt ein Fehler auf:

SELECT abtnr, avg(
gehalt) AS durchschnitt
FROM `persdat`
GROUP BY abtnr
Having Max(durchschnitt)=3Ddurchschnitt;

MySQL meldet:
#1054 - Unknown column 'durchschnitt' in 'having clause'

Mensch, ich komm da nicht weiter und google kann mir auch nicht
helfen, hoffentlich ihr...!?

Grüße
Danyo

Re: alias in having-klausel verwenden?

am 02.06.2007 14:20:55 von Dominik Echterbruch

danyo schrieb:
>
> SELECT abtnr, avg(
> gehalt) AS durchschnitt
> FROM `persdat`
> GROUP BY abtnr
> Having Max(durchschnitt)=durchschnitt;

Was genau soll dieses Statement liefern? Für mich ergibt das keinen
Sinn. Ich kann nur vermuten, daß du die Abteilung mit dem höchsten
Durchschnittsgehalt haben möchtest. Stimmt das?

> MySQL meldet:
> #1054 - Unknown column 'durchschnitt' in 'having clause'

Ja, das stimmt. Den Alias kannst du im GROUP BY und HAVING nicht
verwenden, weil er erst zu einem späteren Zeitpunkt angewendet wird
(wann genau, sagt dir die DML-Definition). Verwende stattdessen
AVG(gehalt). Aber ich glaube immer noch nicht, daß du dann das bekommst,
was du gerne hättest.

Grüße,
Dominik
--
Wo kämen wir denn hin, wenn jeder sagen würde wo kämen wir hin, aber
niemand gehen würde um zu sehen, wohin wir kämen, wenn wir gingen?
(Autor unbekannt)

Re: alias in having-klausel verwenden?

am 02.06.2007 14:43:59 von danyo

Ja ich möchte die Abteilung mit den höchsten Durchscnittsgehalt
herausfinden.
Ohne having-klausel sieht das so Ergebnis aus:
>>>SELECT abtnr, avg(
gehalt
) AS durchschnitt
FROM `persdat`
GROUP BY abtnr<<<
----------------------------------
abtnr durchschnitt
1 5000.000000
2 3900.000000
3 3716.666667
4 2900.000000
-----------------------------------
jetzt soll die Abfrage aber so erweitert werden, dass nur noch die
obere Zeile ausgegeben wird...

Ich habs auch schon mit einer Unterabfrage probiert:
having durchschnitt=3D(Select abtnr,avg(gehalt) As v From persdat GROUP
BY abtnr Having v=3D5000 ) //so klappts wegen den 5000
having durchschnitt=3D(Select abtnr,avg(gehalt) As v From persdat GROUP
BY abtnr Having v=3Dmax(durchschnitt) ) //so leider nich, obwohl
max(durchschnitt) auch 5000 ergeben müsste

Mit den Unterabfragen kommen jedoch keien Fehlermeldungen mehr

Wie kann das den funktionieren?

Re: alias in having-klausel verwenden?

am 02.06.2007 14:57:51 von Kai Ruhnau

danyo wrote:
> Ja ich möchte die Abteilung mit den höchsten Durchscnittsgehalt
> herausfinden.
> Ohne having-klausel sieht das so Ergebnis aus:
>>>> SELECT abtnr, avg(
> gehalt
> ) AS durchschnitt
> FROM `persdat`
> GROUP BY abtnr<<<
> ----------------------------------
> abtnr durchschnitt
> 1 5000.000000
> 2 3900.000000
> 3 3716.666667
> 4 2900.000000
> -----------------------------------
> jetzt soll die Abfrage aber so erweitert werden, dass nur noch die
> obere Zeile ausgegeben wird...

ORDER BY und LIMIT sind deine Freunde.

Grüße
Kai

--
This signature is left as an exercise for the reader.

Re: alias in having-klausel verwenden?

am 02.06.2007 15:18:18 von Dominik Echterbruch

danyo schrieb:
> Ja ich möchte die Abteilung mit den höchsten Durchscnittsgehalt
> herausfinden.
> Wie kann das den funktionieren?

Da fällt mir jetzt auf Anhieb nur ein Umweg über eine View ein (die mußt
du natürlich nur ein Mal anlegen):
CREATE VIEW persdat_avg_gehalt AS
SELECT AVG(gehalt) durchschnitt, abtnr
FROM persdat
GROUP BY abtnr;

Und dann der übliche LEFT JOIN:
SELECT a.durchschnitt, a.abtnr
FROM persdat_avg_gehalt a
LEFT JOIN persdat_avg_gehalt b ON a.durchschnitt < b.durchschnitt
WHERE b.abtnr IS NULL

Warum das funktioniert, ergooglest du dir bitte. Ähnliche Aufgaben
wurden hier schon mehrfach gelöst.

Grüße,
Dominik
--
Wo kämen wir denn hin, wenn jeder sagen würde wo kämen wir hin, aber
niemand gehen würde um zu sehen, wohin wir kämen, wenn wir gingen?
(Autor unbekannt)

Re: alias in having-klausel verwenden?

am 02.06.2007 15:19:27 von Dominik Echterbruch

Kai Ruhnau schrieb:
>> Ja ich möchte die Abteilung mit den höchsten Durchscnittsgehalt
>> herausfinden.
>> Ohne having-klausel sieht das so Ergebnis aus:
>>>>> SELECT abtnr, avg(
>> gehalt
>> ) AS durchschnitt
>> FROM `persdat`
>> GROUP BY abtnr<<<
>> ----------------------------------
>> abtnr durchschnitt
>> 1 5000.000000
>> 2 3900.000000
>> 3 3716.666667
>> 4 2900.000000
>> -----------------------------------
>> jetzt soll die Abfrage aber so erweitert werden, dass nur noch die
>> obere Zeile ausgegeben wird...
>
> ORDER BY und LIMIT sind deine Freunde.

Ja, das geht natürlich auch :)

Grüße,
Dominik
--
Wo kämen wir denn hin, wenn jeder sagen würde wo kämen wir hin, aber
niemand gehen würde um zu sehen, wohin wir kämen, wenn wir gingen?
(Autor unbekannt)