表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语句或存储过程怎么写

解决方案 »

  1.   

    每页每种类型(type)的记录(itemid)至多出现3条 --------
    比较复杂
      

  2.   

    一个好的解决方案是写一个分页的存储过程,
    如: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自己学
      

  3.   

    ---限制小于3条的语句
    select [type],cont(1) from tb group by [type] having count(1)<=3
      

  4.   

    select [type],count(1) from tb group by [type] having count(1)<=3
      

  5.   

    select * from t where type in(select type from t group by type having count(1)<3)
      

  6.   

    看来大家对于:每页每种类型(type)的记录(itemid)至多出现3条 
    这句话理解有误。
    这句话的意思是:如果某个类型(type)有五条出现在第一页,那么只能出现前三条,
    剩下的只能在第二页出现。当然第一页出现过的第二页就不能再出现了。