Filtrer avec HAVING

Améliorer la performance des requêtes dans SQL Server

Dean Smith

Founder, Atamai Analytics

Ordre de traitement de HAVING

1.  FROM
4.  WHERE
6.  HAVING
7.  SELECT
Améliorer la performance des requêtes dans SQL Server

Regrouper avec un filtre WHERE sur les lignes

SELECT Team, 
    SUM(TotalPoints) AS TotalSGTeamPoints
FROM PlayerStats
WHERE Position = 'SG'
GROUP BY Team
Équipe TotalSGTeamPoints
ATL 2034
BOS 1606
BRK 2126
CHI 2905
CHO 2661
CLE 2489
... ...
Améliorer la performance des requêtes dans SQL Server

Filtrage de lignes avec 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'

N'utilisez pas HAVING pour filtrer des lignes individuelles ou non regroupées

Équipe TotalSGTeamPoints
ATL 2034
BOS 1606
BRK 2126
CHI 2905
CHO 2661
CLE 2489
... ...
Améliorer la performance des requêtes dans SQL Server

Agrégation par groupe

SELECT 
    Team, 
    SUM(DRebound+ORebound) AS TotRebounds,
    SUM(DRebound) AS TotDef,
    SUM(ORebound) AS TotOff
FROM PlayerStats
GROUP BY Team;
Équipe 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
... ... ... ...
Améliorer la performance des requêtes dans SQL Server

Filtrer des groupes avec WHERE

SELECT 
    Team, 
    SUM(DRebound+ORebound) AS TotRebounds,
    SUM(DRebound) AS TotDef,
    SUM(ORebound) AS TotOff
FROM PlayerStats
WHERE ORebound >= 1000
GROUP BY Team;
  • Utilisez WHERE pour filtrer des lignes individuelles et HAVING pour un filtre numérique sur des lignes regroupées
Équipe TotRebounds TotDef TotOff
Améliorer la performance des requêtes dans SQL Server

Sans fonction d'agrégation

SELECT 
    Team, 
    SUM(DRebound+ORebound) AS TotRebounds,
    SUM(DRebound) AS TotDef,
    SUM(ORebound) AS TotOff
FROM PlayerStats
GROUP BY Team
HAVING ORebound >= 1000;
  • Appliquez le filtre HAVING à une colonne numérique au moyen d'une fonction d'agrégation
------------------------------------------------
-- ERREUR
La colonne 'PlayerStats.ORebound' est invalide dans la 
clause HAVING, car elle n'est incluse ni dans une 
fonction d'agrégation ni dans la clause GROUP BY.
Améliorer la performance des requêtes dans SQL Server

Avec une fonction d'agrégation

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; 
Équipe TotRebounds TotDef TotOff
OKC 3695 2671 1024
Améliorer la performance des requêtes dans SQL Server

Résumé

  • N'utilisez pas HAVING pour filtrer des lignes individuelles ou non regroupées
  • Utilisez WHERE pour filtrer des lignes individuelles et HAVING pour un filtre numérique sur des lignes regroupées
  • HAVING ne s'applique qu'à une colonne numérique dans un filtre avec fonction d'agrégation
Améliorer la performance des requêtes dans SQL Server

Passons à la pratique !

Améliorer la performance des requêtes dans SQL Server

Preparing Video For Download...