我不确定标题是什么,所以事先道歉。
假设我有一个看起来像SELECT City from Cities
的简单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个查询:a top(10), middle(10)和剩下的。如果我要从.Net应用运行此查询,则dataset
将有3 datatables
。
这里的问题是我没有什么可以用来分组数据。即使我做了,我也不想。我想指定此查询将返回多少个数据表以及每个数据表将包含多少行。
答案 0 :(得分:1)
我想你想使用row-number()
和一些算术:
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查询只返回一个结果集。
答案 1 :(得分:1)
如果您使用的是SQL Server 2012或更高版本,则可以使用OFFSET / FETCH关键字:
所以这会得到你的前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
答案 2 :(得分:0)
您需要Cursor或WHILE loop。当我在大约30分钟休息时,我会充实代码,但是现在已经足够说你需要将它与窗口函数结合起来将集合分成10组,然后选择每组1 ×1。
像这样的Summat:
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
答案 3 :(得分:0)
我认为最好的解决方案是动态查询中循环和偏移子句的组合。在那里:
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
希望它有所帮助!
答案 4 :(得分:-1)
任何版本的SQL Server *都没有原生版本可以让你说“返回N&gt; 1个数据集基于以下标准“在单个T-SQL语句中。根据(迄今为止3个)其他回复,您必须构建N个不同且经过仔细构建的查询。
(好吧,我没有和2012年或2014年一起工作过,但如果他们确实有这样的语法,我会非常惊讶 - 而且还会被投票。)