sql >> Base de Datos >  >> RDS >> Sqlserver

Devolver un porcentaje de un conjunto de resultados en SQL Server

En SQL Server, puede usar el TOP cláusula para limitar las filas devueltas de una consulta a un determinado porcentaje del conjunto de resultados.

Por ejemplo, podría devolver el 10% superior de los resultados, o cualquier porcentaje que necesite.

Ejemplo 1:el conjunto de resultados completo

Primero, devolvamos el conjunto de resultados completo:

SELECT
  AlbumId,
  AlbumName 
FROM Albums
ORDER BY AlbumId;

Resultado:

+-----------+--------------------------+
| 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                   |
+-----------+--------------------------+

Así que hay 22 filas en el conjunto de resultados completo.

Ejemplo 2:devolver el 10 % superior de los resultados

Ahora devolvamos el 10 por ciento superior de esos resultados:

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

Resultado:

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

En este caso, se devuelven tres filas.

Podrías notar que el 10 por ciento de 22 es en realidad 2.2 (no 3). Obviamente, SQL Server no puede presentar 2,2 filas, por lo que redondea los resultados.

Ejemplo 2:redondeo hacia arriba en lugar de hacia abajo

En caso de que se pregunte por qué SQL Server no redondea los resultados hacia abajo siempre que la parte fraccionaria sea menor que 5, fíjate en el siguiente ejemplo.

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

Resultado:

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

Recuerde que el conjunto de resultados completo tenía 22 filas, por lo que el 1 por ciento de 22 filas significaría que se deben devolver 0,22 filas.

Y esta es precisamente la razón por la que no nos gustaría ser redondeados. Si se redondean 0,22 filas hacia abajo, no se devolvería ninguna fila, lo que nos llevaría incorrectamente a concluir que no hubo coincidencias para nuestra consulta.

Ejemplo 3:cero por ciento

Como era de esperar, usar 0 por ciento devolverá cero filas.

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

Resultado:

(0 rows affected)

Ejemplo 4:Porcentaje máximo

Solo puede proporcionar valores porcentuales entre 0 y 100.

Aquí hay un ejemplo de intentar usar un valor superior a 100:

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

Resultado:

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

Ejemplo 5:porcentajes negativos

Como se mencionó, los valores porcentuales deben estar entre 0 y 100, por lo que obtendrá un error si proporciona un porcentaje negativo.

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

Resultado:

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