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

Czy w havingu można mieć kilka warunków?
  • Rejestracja: dni
  • Ostatnio: dni
0

Np.:

Kopiuj
HAVING (AVG(pensja) > 1500) AND (UPPER(lokalizacja) = 'BIAŁYSTOK' OR  UPPER(lokalizacja) = 'WARSZAWA');
PA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3891
0

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

Kopiuj
SELECT
    KOLUMNY DO GRUPOWANIA
   ,AVG(PENSJA)
FROM
    TAB
WHERE
    UPPER(lokalizacja) IN ('BIAŁYSTOK','WARSZAWA')
GROUP BY
    KOLUMNY DO GRUPOWANIA
HAVING 
    (AVG(pensja) > 1500)
FI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 88
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?:

Kopiuj
 select Id from dbo.Tabela
group by Id
having Id= 3 
PA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3891
0

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

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

Do poprawy jest przeniesienie warunku na walutę do WHERE

Kopiuj
SELECT id 
FROM   dbo.tabela 
WHERE waluta = 'PLN'
GROUP  BY id 
HAVING id=3
FI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 88
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 :)

Vardamir
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
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

FI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 88
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ź :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.