Как использовать ограничение результатов, возвращаемых с сервера SQL с использованием ROW_NUMBER () - PullRequest
1 голос
/ 15 апреля 2020

У меня есть база данных, как показано ниже

CREATE DATABASE Test2;

CREATE TABLE table1
(
    name nvarchar(50),
    year int,
    total1 int,
    total2 int
);

INSERT INTO table1 (name, year, total1,total2)
VALUES ('a', 2020, 25,3);
INSERT INTO table1 (name, year, total1,total2)
VALUES ('b', 2018, 33,4);
INSERT INTO table1 (name, year, total1,total2)
VALUES ('c', 2020, 10,3);
INSERT INTO table1 (name, year, total1,total2)
VALUES ('b', 2018, 7,2);
INSERT INTO table1 (name, year, total1,total2)
VALUES ('a', 2020, 20,6);

Я хочу ограничить результаты, возвращаемые сервером SQL (возьмите 2-ю строку и 3-ю строку) этим кодом

select 
    *
from
    (select 
         year, name, 
         sum(total1) as "sum_Total1", 
         sum(total2) as "sum_Total2", 
         round((cast(isnull(sum(total2), 0) as float)) / (cast(sum(total1) as float)), 3) as "sum_Total2/sum_Total1", 
         row_number() over (order by round((cast(isnull(sum(total2), 0) as float)) / (cast(sum(total1) as float)), 3) asc) as no
     from 
         Table_1
     group by 
         name, year
     order by 
         round((cast(isnull(sum(total2), 0) as float)) * 100 / (cast(sum(total1) as float)), 3) asc) a
where 
    a.no > 1 and a.no < 3

SQL Сервер возвращает ошибку:

Предложение ORDER BY недопустимо в представлениях, встроенных функциях, производных таблицах, подзапросах и выражениях общих таблиц, если также не указаны TOP, OFFSET или FOR XML .

Ответы [ 3 ]

1 голос
/ 15 апреля 2020

есть две проблемы:

  1. Вы не используете ту же таблицу, которую создали.

  2. , чтобы получить 2-ю и 3-ю строку , вам нужно изменить условие a.no <3 на a.no <= 3 </p>

, так как предложение order by не используется, поскольку у нас no.

Наконец:

SELECT *
FROM
(
    SELECT year, 
           name, 
           SUM(total1) AS "sum_Total1", 
           SUM(total2) AS "sum_Total2", 
           ROUND((CAST(ISNULL(SUM(total2), 0) AS FLOAT)) / (CAST(SUM(total1) AS FLOAT)), 3) AS "sum_Total2/sum_Total1", 
           ROW_NUMBER() OVER(
           ORDER BY ROUND((CAST(ISNULL(SUM(total2), 0) AS FLOAT)) / (CAST(SUM(total1) AS FLOAT)), 3) ASC) AS no
    FROM Table1
    GROUP BY name, 
             year
    --ORDER BY ROUND((CAST(ISNULL(SUM(total2), 0) AS FLOAT)) * 100 / (CAST(SUM(total1) AS FLOAT)), 3) ASC
) a
WHERE a.no > 1
      AND a.no <= 3;
1 голос
/ 15 апреля 2020

На самом деле, поскольку вы уже использовали Order By в этой строке ROW_NUMBER() over(ORDER BY ROUND, вам не нужно снова использовать его во внутреннем запросе после группировки. Таким образом, все, что вам нужно сделать, это удалить ненужный порядок после вашей группы по ключевому слову.

Кроме того, к вашему сведению, я вижу, что вы запросили от Table_1, в то время как имя вашей таблицы table1, поэтому Вы должны исправить это также.

0 голосов
/ 15 апреля 2020

Просто переместите заказ за пределы своего подзапроса:

select * 
from
(
select year ,name,
sum(total1) as "sum_Total1", 
SUM(total2) as "sum_Total2", 
ROUND((CAST(ISNULL(sum(total2),0) as float))/ 
      (CAST(sum(total1) as float)),3) as "sum_Total2/sum_Total1", 
ROW_NUMBER() over (ORDER BY 
ROUND((CAST(ISNULL(sum(total2),0) as float))/ (CAST(sum(total1) as float)),3) ASC )  as no
from Table1
group by name, year
) a
where a.no > 1 and a.no < 4
order by no;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...