表t数据结构如下:
itemid type
1 A
2 B
3 C
4 D
5 E
6 G
7 H
8 G
9 K
10 L
11 M
12 A
13 B
14 C
15 D
16 A
17 C
18 F
………………对t查询分页显示,每页显示15条记录(itemid),
每页每种类型(type)的记录(itemid)至多出现3条
请问Sql语句或存储过程怎么写
itemid type
1 A
2 B
3 C
4 D
5 E
6 G
7 H
8 G
9 K
10 L
11 M
12 A
13 B
14 C
15 D
16 A
17 C
18 F
………………对t查询分页显示,每页显示15条记录(itemid),
每页每种类型(type)的记录(itemid)至多出现3条
请问Sql语句或存储过程怎么写
比较复杂
如:CREATE PROCEDURE dbo.sp_DataPages
@Sql nVARCHAR(2000),
@PK varchar(50), --主键字段名(可以是任何数据类型;不能,并且也不需要带表名前缀,如:不可以是users.id)
@Order varchar(50), --排序方式(带desc或asc,可以是多个组合;不能,并且也不需要带表名前缀,如:不可以是users.id desc)
@Page int,
@PageSize int = 30
ASset nocount onDECLARE @Str nVARCHAR(4000)if(@Page=1)
SET @Str= 'Select Top '+ CAST((@PageSize) As VARCHAR(20)) + ' * From ('+ @Sql + ') As table1 Order By table1.' + @Order
else
SET @Str= 'Select Top '+ CAST((@PageSize) As VARCHAR(20)) + ' * From ('+ @Sql + ') As table1 Where table1.' + @PK + ' Not In (Select Top ' + CAST((@PageSize*(@Page-1)) AS VARCHAR(20)) + ' ' + @PK + ' From (' + @Sql + ') As table2 Order By table2.' + @Order + ' ) Order By table1.' + @Order--print @str
--exec (@Str)
EXEC sp_ExecuteSql @Strset nocount offGO或者,使用sql server 2005中的row_number()函数declare @sql varchar(8000)
set @sql='select *'
+' from'
+' ('+' select row_number() over (order by id desc) as rowNumber,*'
+' from Users'
+' where id>0 and name<>'''''+' )'
+' as table1'+' where rowNumber between '+str((@page-1)*@pagesize+1)+' AND '+str(@page*@pagesize)
+' order by id desc'--exec (@sql)
EXEC sp_ExecuteSql @sql自己学
select [type],cont(1) from tb group by [type] having count(1)<=3
这句话理解有误。
这句话的意思是:如果某个类型(type)有五条出现在第一页,那么只能出现前三条,
剩下的只能在第二页出现。当然第一页出现过的第二页就不能再出现了。