如果数据共有N条,采用分页显示,每页显示M条,请问一共有多少页?请给出公式
count = (N%M==0)?(N/M):(N/M + 1)这个做法是比较直观的思路。得出的结果是完全正确的。这个方案需要一个%运算,一个判断运算,一个除法,而乘除、取余要比加减法效率低太多。 如果用另外一种算法,可以减少一次乘除(取余),而且不用if..else...判断,当然也不用三元去运算符? : 。权当锻炼脑子了,如何设计一个比这个方法效率更高的公式?
这虽说是web方面的但是我看在sql中也经常遇到过例如select (case when count(1)%3 = 0 then count(1)/3 else count(1)/3+1 end) cnt from Tb1这个语句摘自 求一条数据行转列SQL 高手指点 在线等!!

解决方案 »

  1.   

    你要嫌弃麻烦可以用ceiling
    CREATE TABLE [dbo].[Tb1](
        [AA] [nchar](10) COLLATE Chinese_PRC_CI_AS NULL,
        [BB] [nchar](10) COLLATE Chinese_PRC_CI_AS NULL,
        [CC] [nchar](10) COLLATE Chinese_PRC_CI_AS NULL
    ) ON [PRIMARY]
    --插入数据值
    insert into Tb1(AA,BB,CC) values('王01','A1','C1')
    insert into Tb1(AA,BB,CC) values('王02','A2','C2')
    insert into Tb1(AA,BB,CC) values('王03','A3','C3')
    insert into Tb1(AA,BB,CC) values('王04','A4','C4')
    insert into Tb1(AA,BB,CC) values('王05','A5','C5')
    insert into Tb1(AA,BB,CC) values('王06','A6','C6')
    insert into Tb1(AA,BB,CC) values('王07','A7','C7')
    insert into Tb1(AA,BB,CC) values('王08','A8','C8')
    insert into Tb1(AA,BB,CC) values('王09','A9','C9')
    insert into Tb1(AA,BB,CC) values('王10','A10','C10')
    insert into Tb1(AA,BB,CC) values('王11','A11','C11')
    insert into Tb1(AA,BB,CC) values('王12','A12','C12')
    insert into Tb1(AA,BB,CC) values('王13','A13','C13')
    insert into Tb1(AA,BB,CC) values('王14','A14','C14')
    goselect CEILING (count(1)*1.0/3) cnt from tb1
    /*
    cnt                  
    -------------------- 
    5(所影响的行数为 1 行)
    */drop table tb1
      

  2.   

    没问题,正常思路就是这样写,但是还有改进的余地,能够稍微那么提高一点点效率
    上面sql可以不用case when then else end 来判断来得到cnt
      

  3.   

    呵呵 又学习一个新函数
    其实还可以这样写的
    select (count(1)+3-1)/3 cnt from Tb1
    拓展一下就是select ((count(1)+M-1)/M) cnt from Tb1
    这样就可以省去利用函数求的cnt
      

  4.   

    在web中N条数据每页M条就可以写成page=(M+N-1)/M=(N-1)/M+1
      

  5.   

    set @pageCount =(@N+@M-1)/@M; --关键公式:
      我也是这样用的。--假如:table1 是要查的表;
    create procedure [getpagedata] 
    @page int,--要第几页
    @M int --每页多长。
    as
    begin
    declare @index int; --要查的数据,从第几条起 。
    declare @pageCount int; --要查的数据有几页;
    declare @N int;
    --下面是取得条件:
    select @N = count(*) from table1;
     set @pageCount =(@N+@M-1)/@M; --关键公式:
    if @page>@pageCount
    set @page =@pageCount;
    if(@page<0)
    set @page =0;
    set @index = @M*@page;
    --查询表:
    select *from
    (
    select row_number() over(order by id asc) as rn,* from table1
    ) as tab
     where(@index<=tab.rn and tab.rn<(@index+@M))
    end