Czy w havingu można mieć kilka warunków?

0

Np.:

HAVING (AVG(pensja) > 1500) AND (UPPER(lokalizacja) = 'BIAŁYSTOK' OR  UPPER(lokalizacja) = 'WARSZAWA');
0

Można, tylko w HAVING warunki są na funkcje agregujące, czyLi u ciebie warunki na lokalizacje wędrują do where

SELECT
    KOLUMNY DO GRUPOWANIA
   ,AVG(PENSJA)
FROM
    TAB
WHERE
    UPPER(lokalizacja) IN ('BIAŁYSTOK','WARSZAWA')
GROUP BY
    KOLUMNY DO GRUPOWANIA
HAVING 
    (AVG(pensja) > 1500)
0

Nie do końca jest to prawda, że Having jest na funkcje agregujące. Jeśli HAVING jest na czymś to jest na grupach danych w wyniku grupowania danych poleceniem GROUP BY bo jak wytłumaczyć takie zapytanie bez funkcji w SELECT i samym poleceniu HAVING?:

 select Id from dbo.Tabela
group by Id
having Id= 3 
0

To zależy od silnika i jego możliwości, ale wystarczy że zmodyfikuje Twoje zapytanie i nie zadziała:

SELECT id 
FROM   dbo.tabela 
GROUP  BY id 
HAVING waluta = 'PLN' and id=3

Do poprawy jest przeniesienie warunku na walutę do WHERE

SELECT id 
FROM   dbo.tabela 
WHERE waluta = 'PLN'
GROUP  BY id 
HAVING id=3
0

Oczywiście, że warunek generalnie powinien być w WHERE. Tego nie kwestionowałem. Odniosłem się tylko do tego co to jest having i że nie stosujecie go tylko i wyłącznie na funkcjach agregujących aczkolwiek zgodzę się, że to jego główne zastosowanie.
Potrafię również zrozumieć, że w innych silnikach działa to inaczej :)

0

@firefox
HAVING używa się na dla grupy lub zbioru w ramach grupy.

Przytoczony przez Ciebie przykład użycia HAVING to odniesienie się do grupy wyznaczonej przez Id=3, a nie do wierszy o Id=3.

Na MSDN możemy przeczytać:

Specifies a search condition for a group or an aggregate.
https://msdn.microsoft.com/pl-pl/library/ms180199(v=sql.110).aspx

0

Przecież tak napisałem :)

Jeśli HAVING jest na czymś** to jest na grupach danych w wyniku grupowania danych poleceniem GROUP BY**

Jeszcze raz pozwole sobie napisać, że having nie jest tylko i wyłącznie do filtrowania grup na funkcjach, dlatego, że zaprezentowany przeze mnie przykład działa bez użycia jakiejkolwiek funkcji i oczywiście odnosi się do grupy o id = 3. Natomiast przykład ten zaznaczam raz jeszcze pokazuje, że Having możemy użyć również wtedy gdy nie jest użyta żadna funkcja czy to w SELECT czy w Group by czy w jakimkolwiek innym miejscu :)

Ty natomiast napisałeś:

tylko w HAVING warunki są na funkcje agregujące

Tyle w tym wątku kończę swoją wypowiedź :)

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