Sql SELECT语句如何按行号返回不同的组?

Sql SELECT语句如何按行号返回不同的组?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我不确定标题会是什么,所以事先道歉 假设我有一个简单的TSQL语句,看起来像是从城市中选择城市。这将返回一个包含26行的结果: City New York Los Angeles Chicago Houston Philadelphia Phoenix San Antonio San Diego Dallas San Jose Austin Indianapolis Jacksonville San Francisco Columbus Charlotte Fort Worth El Paso

我不确定标题会是什么,所以事先道歉

假设我有一个简单的TSQL语句,看起来像是从城市中选择城市。这将返回一个包含26行的结果:

City
New York
Los Angeles
Chicago
Houston
Philadelphia
Phoenix
San Antonio
San Diego
Dallas
San Jose
Austin
Indianapolis
Jacksonville
San Francisco
Columbus
Charlotte
Fort Worth
El Paso
Memphis
Seattle
Denver
Washington
Boston
Nashville
Baltimore
Oklahoma City
现在,假设我想把这个结果分成3组,每组10行。换句话说,当我运行查询时,结果将显示三个不同的行集,前两个有10行,最后一个有6行。就好像我同时运行了这3个查询:前10名、中10名和剩余内容。如果我从.Net应用程序运行此查询,则数据集将有3个数据表


这里的问题是,我无法使用任何东西对数据进行分组。即使我做了,我也不想。我想指定此查询将返回多少个数据表,以及每个数据表将有多少行。

我想您需要使用行号和一些算术:

select ((seqnum  - 1) / 10) as grp, city
from (select city, row_number() over (order by (select NULL)) as seqnum
      from cities
     ) c;
请注意,不能保证订购。您确实需要一个特定的列来指定顺序,因为SQL表表示无序集

编辑:


你到底想做什么还不清楚。这将行分成10组,这似乎是您想要做的。当然,这只返回一个结果集-任何SQL查询只返回一个结果集。

如果您使用的是SQL Server 2012或更高版本,则可以使用偏移/提取关键字:

因此,这将得到您的前10个城市:

SELECT City
FROM Cities
ORDER BY City
    OFFSET 0 ROWS
    FETCH NEXT 10 ROWS ONLY
这将得到下一个10:

SELECT City
FROM Cities
ORDER BY City
    OFFSET 10 ROWS
    FETCH NEXT 10 ROWS ONLY
也可以用变量替换这些数字:

DECLARE @PageSize INT = 10
DECLARE @PageNumber INT = 5

SELECT City
FROM Cities
ORDER BY City
    OFFSET @PageNumber * @PageSize ROWS
    FETCH NEXT @PageSize ROWS ONLY
你需要一个或者可能一个。我将在大约30分钟的休息时间内充实代码,但现在可以说,您需要将其与窗口功能结合起来,将集合分成10组,然后逐个选择每组

这样说:

declare @paginator int = 0
declare @totalPages int = (select count(*) from cities) / 10 + 1

while @paginator <= @totalPages
begin
    select city
    from (
        select 
            city, 
            row_number() over (order by city) as rownumber
      from cities)
    where rownumber <= @paginator * 10 + 10 
    AND rownumber > @paginator * 10

    set @paginator = @paginator + 1
end

任何版本的SQL server*都不允许您在单个T-SQL语句中说“基于以下条件返回N>1个数据集”。根据目前为止的3个其他回复,您必须构建N个不同的、精心构造的查询


好的,我没有使用过2012或2014,但是如果他们真的有这样的语法,我会感到非常惊讶并投反对票。

我认为最好的解决方案是在动态查询中结合使用loop和offset子句。就这样:

create table city(
  name varchar(100)
)

insert into city values ('City')
insert into city values ('New York')
insert into city values ('Los Angeles')
insert into city values ('Chicago')
insert into city values ('Houston')
insert into city values ('Philadelphia')
insert into city values ('Phoenix')
insert into city values ('San Antonio')
insert into city values ('San Diego')
insert into city values ('Dallas')
insert into city values ('San Jose')
insert into city values ('Austin')
insert into city values ('Indianapolis')
insert into city values ('Jacksonville')
insert into city values ('San Francisco')
insert into city values ('Columbus')
insert into city values ('Charlotte')
insert into city values ('Fort Worth')
insert into city values ('El Paso')
insert into city values ('Memphis')
insert into city values ('Seattle')
insert into city values ('Denver')
insert into city values ('Washington')
insert into city values ('Boston')
insert into city values ('Nashville')
insert into city values ('Baltimore')
insert into city values ('Oklahoma City')

DECLARE @TOTAL INT
        ,@GROUP INT
        ,@STR VARCHAR(10)

SELECT 
    @GROUP=0
    ,@TOTAL=COUNT(*) 
FROM CITY

WHILE @GROUP < @TOTAL
BEGIN
   SELECT @STR=CAST(@GROUP AS VARCHAR(10))

   EXEC('SELECT Name '+
        'FROM City '+
        '    OFFSET '+@STR+' ROWS '+
        '    FETCH NEXT 10 ROWS ONLY')

    SELECT @GROUP += 10;
END

希望有帮助

哪个版本的SQL Server?现在有四个答案,但其中一个已被自删除。不正确。您可以构造循环来完成此操作。OFFSET/FETCH,这是一个赢家!但我不会投反对票:循环一条语句并多次运行它并不是一次执行一条语句。Offset/Fetch可以工作,但必须运行三个不同的查询。我正在处理一个我认为是对一条语句的请求,该语句将返回三个数据集。这不会返回单独的结果集。@jeff。它给他们分配了单独的组ID,这似乎是对这个问题的一个非常合理的回答。我想指定这个查询将返回多少个数据表,以及每个数据表将有多少行-我不同意。我将删除我的-1,因为我认为这是解决类似问题的好方法。除非它被编辑,否则我不能。我理解你的观点。我只是觉得这个问题模棱两可,所以这是一个好的开始。我确实在问题中添加了一个注释。我发现这个解决方案很有趣,因为如果您向city表中添加更多值,则无需更改查询,它将根据需要生成尽可能多的集合。