Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Retornar uma porcentagem de um conjunto de resultados no SQL Server


No SQL Server, você pode usar o TOP cláusula para limitar as linhas retornadas de uma consulta a uma determinada porcentagem do conjunto de resultados.

Por exemplo, você pode retornar os 10% principais dos resultados ou qualquer porcentagem necessária.


Exemplo 1 – O conjunto de resultados completo


Primeiro, vamos retornar o 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                   |
+-----------+--------------------------+

Portanto, há 22 linhas no conjunto de resultados completo.

Exemplo 2 – Retorne os 10% melhores dos resultados


Agora vamos retornar os 10% principais desses resultados:
SELECT TOP(10) PERCENT
  AlbumId,
  AlbumName 
FROM Albums
ORDER BY AlbumId;

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

Nesse caso, três linhas são retornadas.

Você pode notar que 10% de 22 é na verdade 2,2 (não 3). Obviamente, o SQL Server não pode apresentar 2,2 linhas, então arredonda os resultados.

Exemplo 2 – Arredondando para cima em vez de para baixo


Caso você esteja se perguntando por que o SQL Server não arredonda os resultados para baixo sempre que a parte fracionária for menor que 5, dê uma olhada no exemplo a seguir.
SELECT TOP(1) PERCENT
  AlbumId,
  AlbumName 
FROM Albums
ORDER BY AlbumId;

Resultado:
+-----------+-------------+
| AlbumId   | AlbumName   |
|-----------+-------------|
| 1         | Powerslave  |
+-----------+-------------+

Lembre-se de que o conjunto de resultados completo tinha 22 linhas, portanto, 1% de 22 linhas significaria que 0,22 linhas deveriam ser retornadas.

E é precisamente por isso que não gostaríamos de ser arredondados para baixo. Se 0,22 linhas forem arredondadas para baixo, nenhuma linha será retornada, levando-nos incorretamente a concluir que não houve correspondências para nossa consulta.

Exemplo 3 – Zero Percentual


Como você pode esperar, usar 0 por cento retornará zero linhas.
SELECT TOP(0) PERCENT
  AlbumId,
  AlbumName 
FROM Albums
ORDER BY AlbumId;

Resultado:
(0 rows affected)

Exemplo 4 - Porcentagem máxima


Você só pode fornecer valores percentuais entre 0 e 100.

Aqui está um exemplo de tentativa de usar um valor maior que 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.

Exemplo 5 – Porcentagens negativas


Conforme mencionado, os valores percentuais devem estar entre 0 e 100, portanto, você receberá um erro se fornecer uma porcentagem negativa.
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.