Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Връщане на процент от набор от резултати в SQL Server

В SQL Server можете да използвате TOP клауза за ограничаване на редовете, върнати от заявка, до определен процент от набора от резултати.

Например, можете да върнете първите 10% от резултатите или какъвто и да е процент, от който се нуждаете.

Пример 1 – Пълният набор от резултати

Първо, нека върнем пълния набор от резултати:

SELECT
  AlbumId,
  AlbumName 
FROM Albums
ORDER BY AlbumId;

Резултат:

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

Така че има 22 реда в пълния набор от резултати.

Пример 2 – Връщане на най-добрите 10% от резултатите

Сега нека върнем първите 10 процента от тези резултати:

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

Резултат:

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

В този случай се връщат три реда.

Може да забележите, че 10 процента от 22 всъщност са 2,2 (а не 3). Очевидно SQL Server не може да представи 2.2 реда, така че закръгля резултатите нагоре.

Пример 2 – Закръгляване нагоре, вместо надолу

В случай, че се чудите защо SQL Server не закръгля резултатите надолу всеки път, когато дробната част е по-малка от 5, разгледайте следния пример.

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

Резултат:

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

Не забравяйте, че пълният набор от резултати имаше 22 реда, така че 1% от 22 реда би означавало, че трябва да бъдат върнати 0,22 реда.

И точно това е причината, поради която не бихме искали да бъдем закръглени надолу. Ако 0,22 реда се закръглят надолу, няма да бъдат върнати редове, което неправилно ни кара да заключим, че няма съвпадения за нашата заявка.

Пример 3 – Нулев процент

Както може да очаквате, използването на 0 процента ще върне нула редове.

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

Резултат:

(0 rows affected)

Пример 4 – Максимален процент

Можете да предоставите само процентни стойности между 0 и 100.

Ето пример за опит за използване на стойност, по-висока от 100:

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

Резултат:

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

Пример 5 – Отрицателни проценти

Както споменахме, процентните стойности трябва да са между 0 и 100, така че ще получите грешка, ако предоставите отрицателен процент.

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

Резултат:

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Често срещани грешки на DBA в MS SQL Server

  2. Как да върнете резултатите от заявката като списък, разделен със запетая в SQL Server – STRING_AGG()

  3. SQL SERVER:Вземете общия брой дни между две дати

  4. Този код предотвратява ли инжектирането на SQL?

  5. Transactionscope хвърля изключение, тази платформа не поддържа разпределени транзакции при отваряне на обект за връзка