Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Renvoyer un pourcentage d'un ensemble de résultats dans SQL Server

Dans SQL Server, vous pouvez utiliser le TOP clause pour limiter les lignes renvoyées par une requête à un certain pourcentage du jeu de résultats.

Par exemple, vous pouvez renvoyer les 10 % des meilleurs résultats, ou le pourcentage dont vous avez besoin.

Exemple 1 - L'ensemble de résultats complet

Commençons par renvoyer le jeu de résultats complet :

SELECT
  AlbumId,
  AlbumName 
FROM Albums
ORDER BY AlbumId;

Résultat :

+-----------+--------------------------+
| AlbumId   | AlbumName                |
|-----------+--------------------------|
| 1         | Powerslave               |
| 2         | Powerage                 |
| 3         | Singing Down the Lane    |
| 4         | Ziltoid the Omniscient   |
| 5         | Casualties of Cool       |
| 6         | Epicloud                 |
| 7         | Somewhere in Time        |
| 8         | Piece of Mind            |
| 9         | Killers                  |
| 10        | No Prayer for the Dying  |
| 11        | No Sound Without Silence |
| 12        | Big Swing Face           |
| 13        | Blue Night               |
| 14        | Eternity                 |
| 15        | Scandinavia              |
| 16        | Long Lost Suitcase       |
| 17        | Praise and Blame         |
| 18        | Along Came Jones         |
| 19        | All Night Wrong          |
| 20        | The Sixteen Men of Tain  |
| 21        | Yo Wassup                |
| 22        | Busted                   |
+-----------+--------------------------+

Il y a donc 22 lignes dans le jeu de résultats complet.

Exemple 2 – Renvoie les 10 % des meilleurs résultats

Renvoyons maintenant les 10 % supérieurs de ces résultats :

SELECT TOP(10) PERCENT
  AlbumId,
  AlbumName 
FROM Albums
ORDER BY AlbumId;

Résultat :

+-----------+-----------------------+
| AlbumId   | AlbumName             |
|-----------+-----------------------|
| 1         | Powerslave            |
| 2         | Powerage              |
| 3         | Singing Down the Lane |
+-----------+-----------------------+

Dans ce cas, trois lignes sont renvoyées.

Vous remarquerez peut-être que 10 % de 22 est en fait 2,2 (et non 3). Évidemment, SQL Server ne peut pas présenter 2,2 lignes, il arrondit donc les résultats.

Exemple 2 – Arrondir vers le haut au lieu de vers le bas

Au cas où vous vous demanderiez pourquoi SQL Server n'arrondit pas les résultats vers le bas chaque fois que la partie fractionnaire est inférieure à 5, regardez l'exemple suivant.

SELECT TOP(1) PERCENT
  AlbumId,
  AlbumName 
FROM Albums
ORDER BY AlbumId;

Résultat :

+-----------+-------------+
| AlbumId   | AlbumName   |
|-----------+-------------|
| 1         | Powerslave  |
+-----------+-------------+

N'oubliez pas que le jeu de résultats complet comportait 22 lignes, donc 1 % de 22 lignes signifierait que 0,22 lignes devraient être renvoyées.

Et c'est précisément pourquoi nous ne voudrions pas être arrondis. Si 0,22 lignes sont arrondies à l'inférieur, aucune ligne ne sera renvoyée, ce qui nous amènera à tort à conclure qu'il n'y a pas de correspondance pour notre requête.

Exemple 3 - Zéro pour cent

Comme vous vous en doutez, l'utilisation de 0 % renverra zéro ligne.

SELECT TOP(0) PERCENT
  AlbumId,
  AlbumName 
FROM Albums
ORDER BY AlbumId;

Résultat :

(0 rows affected)

Exemple 4 - Pourcentage maximum

Vous ne pouvez fournir que des pourcentages compris entre 0 et 100.

Voici un exemple d'essai d'utilisation d'une valeur supérieure à 100 :

SELECT TOP(120) PERCENT
  AlbumId,
  AlbumName 
FROM Albums
ORDER BY AlbumId;

Résultat :

Msg 1031, Level 15, State 1, Line 2
Percent values must be between 0 and 100.

Exemple 5 – Pourcentages négatifs

Comme mentionné, les valeurs de pourcentage doivent être comprises entre 0 et 100, vous obtiendrez donc une erreur si vous fournissez un pourcentage négatif.

SELECT TOP(-10) PERCENT
  AlbumId,
  AlbumName 
FROM Albums
ORDER BY AlbumId;

Résultat :

Msg 1031, Level 15, State 1, Line 3
Percent values must be between 0 and 100.