Filtrare con HAVING

Migliorare le prestazioni delle query in SQL Server

Dean Smith

Founder, Atamai Analytics

Ordine di esecuzione di HAVING

1.  FROM
4.  WHERE
6.  HAVING
7.  SELECT
Migliorare le prestazioni delle query in SQL Server

Raggruppare con filtro di riga WHERE

SELECT Team, 
    SUM(TotalPoints) AS TotalSGTeamPoints
FROM PlayerStats
WHERE Position = 'SG'
GROUP BY Team
Team TotalSGTeamPoints
ATL 2034
BOS 1606
BRK 2126
CHI 2905
CHO 2661
CLE 2489
... ...
Migliorare le prestazioni delle query in SQL Server

Filtro di riga con HAVING

SELECT Team, 
    SUM(TotalPoints) AS TotalSGTeamPoints
FROM PlayerStats
WHERE Position = 'SG'
GROUP BY Team
SELECT Team, 
    SUM(TotalPoints) AS TotalSGTeamPoints
FROM PlayerStats
--WHERE Position = 'SG'
GROUP BY Team, Position
HAVING Position = 'SG'

Non usare HAVING per filtrare righe singole o non raggruppate

Team TotalSGTeamPoints
ATL 2034
BOS 1606
BRK 2126
CHI 2905
CHO 2661
CLE 2489
... ...
Migliorare le prestazioni delle query in SQL Server

Aggregazioni per gruppo

SELECT 
    Team, 
    SUM(DRebound+ORebound) AS TotRebounds,
    SUM(DRebound) AS TotDef,
    SUM(ORebound) AS TotOff
FROM PlayerStats
GROUP BY Team;
Team TotRebounds TotDef TotOff
ATL 3436 2693 743
BOS 3645 2878 767
BRK 3644 2852 792
CHI 3663 2873 790
CHO 3728 2901 827
CLE 3455 2761 694
... ... ... ...
Migliorare le prestazioni delle query in SQL Server

Filtro di gruppo con WHERE

SELECT 
    Team, 
    SUM(DRebound+ORebound) AS TotRebounds,
    SUM(DRebound) AS TotDef,
    SUM(ORebound) AS TotOff
FROM PlayerStats
WHERE ORebound >= 1000
GROUP BY Team;
  • Usa WHERE per filtrare righe singole e HAVING per un filtro numerico su righe raggruppate
Team TotRebounds TotDef TotOff
Migliorare le prestazioni delle query in SQL Server

Senza funzione di aggregazione

SELECT 
    Team, 
    SUM(DRebound+ORebound) AS TotRebounds,
    SUM(DRebound) AS TotDef,
    SUM(ORebound) AS TotOff
FROM PlayerStats
GROUP BY Team
HAVING ORebound >= 1000;
  • Applica il filtro HAVING a una colonna numerica usando una funzione di aggregazione
------------------------------------------------
-- ERRORE
La colonna 'PlayerStats.ORebound' non è valida nella 
clausola HAVING perché non è contenuta né in una 
funzione di aggregazione né nella clausola GROUP BY.
Migliorare le prestazioni delle query in SQL Server

Con funzione di aggregazione

SELECT 
    Team, 
    SUM(DRebound+ORebound) AS TotRebounds,
    SUM(DRebound) AS TotDef,
    SUM(ORebound) AS TotalOff
FROM PlayerStats
GROUP BY Team
    -- aggregate function SUM()
HAVING SUM(ORebound) >= 1000; 
Team TotRebounds TotDef TotOff
OKC 3695 2671 1024
Migliorare le prestazioni delle query in SQL Server

Riepilogo

  • Non usare HAVING per filtrare righe singole o non raggruppate
  • Usa WHERE per righe singole e HAVING per un filtro numerico su righe raggruppate
  • HAVING si applica solo a una colonna numerica in un filtro con funzione di aggregazione
Migliorare le prestazioni delle query in SQL Server

Ayo berlatih!

Migliorare le prestazioni delle query in SQL Server

Preparing Video For Download...