代码之家  ›  专栏  ›  技术社区  ›  Martin

在SQL Server中进行汇总?

  •  9
  • Martin  · 技术社区  · 15 年前

    我已经为sql server编写了一个分页系统。很好,但是我想返回总共有多少页

    因此,如果每页有5条记录和2条记录,那么总共是3页

    这就是我所拥有的

       SELECT @TotalPages = ( (SELECT COUNT(*) FROM #TempItems) / @RecsPerPage )
    

    我的输出参数是这样定义的

       @TotalPages AS INT OUT,
    

    现在它开始工作了:-)在我的测试中,每页有5条记录和2条记录,所以上面的select返回2,但它的错误应该是3

    这是因为它说5/2=整数2。。。我该怎么收尾。。。?

    我把天花板弄累了,但没法用。。

    有什么想法吗?

    提前谢谢

    8 回复  |  直到 15 年前
        1
  •  13
  •   Roopesh Shenoy    15 年前

    你试过把分子和分母都选作浮点数,然后用Cieling吗?

    整数运算总是给出整数。尝试以下操作-

    SELECT @TotalPages = CEILING((SELECT cast(COUNT(*) as float) FROM #TempItems) / @RecsPerPage ) 
    
        2
  •  7
  •   Guffa    15 年前

    可以使用整数运算:

    SELECT @TotalPages = ((SELECT COUNT(*) FROM #TempItems) + @RecsPerPage - 1) / @RecsPerPage
    

    (多年前,我就知道了这个公式(在互联网出现之前,你可以问我是怎么想的),而且已经用过很多次了。)

        3
  •  3
  •   Donnie    15 年前

    整数数学不舍入,它会截断。改变 @RecsPerPage 作为浮点而不是int,然后使用 ceil 在你的sql语句中。

        4
  •  3
  •   JosephStyons    15 年前

    当您将两个整数相除时,SQL Server将始终给出一个整数结果。

    您可以在实际硬编码值的末尾添加“.0”,或乘以“1.0”来转换字段值。如果您想取整,那么我知道的最好的方法是添加0.5,然后调用普通的取整函数。这是因为向下取整(数字+0.5)总是和向上取整(数字)一样。

    正如其他人所指出的,您还可以手动将字段转换为浮点。

    但请注意

    round(1.0 / 2.0,0)
    

    将返回 浮点 结果,然而

    round(cast(1 as float) / cast(2 as float),0)
    

    会给一个 整数 结果。所以用最适合你的那个。

    所有这些都在下面的示例中进行了说明:

    SELECT
      ROUND(5/2,0) AS INTEGER_EXAMPLE
     ,ROUND((5.0 / 2.0),0) AS FLOATING_POINT_EXAMPLE
     ,ROUND(CAST(5 AS FLOAT) / CAST(2 AS FLOAT),0) AS CASTING_EXAMPLE
     ,ROUND((5 * 1.0) / (2 * 1.0),0) AS CONVERTED_TO_FP_EXAMPLE
     ,ROUND(((1 * 1.0) / (4 * 1.0)) + (1.0 / 2.0),0) AS ROUNDED_UP_EXAMPLE
    

    下面是一个函数,它将为您进行汇总,并提供一个选择来显示它给出的结果。

    create function roundup(@n float) returns float
    as
    begin
      --Special case: if they give a whole number, just return it
      if @n = ROUND(@n,0)
        return @n;
    
      --otherwise, add half and then round it down
      declare @result float = @n;
      declare @half float = (1.0 / 2.0);
      set @result = round(@n + @half,0);
    
      return @result;
    end
    
    select
      dbo.roundup(0.0) as example_0
     ,dbo.roundup(0.3) as example_pt_three
     ,dbo.roundup(0.5) as example_pt_five
     ,dbo.roundup(0.9) as example_pt_nine
    
        5
  •  0
  •   Sadhir    15 年前

    尝试

    SELECT @TotalPages = CEILING( (SELECT COUNT(*) FROM #TempItems) * 1.0/ @RecsPerPage ) 
    
        6
  •  0
  •   Mark SQLDev    15 年前

    这里有一些类似的代码。CAST函数防止SQL自动舍入。将0.00调整到所需的精度。

    declare @C int
    declare @D int
    
    SET @C = 5
    SET @D = 2
    
    DECLARE @Answer FLOAT
    
    SELECT @Answer = CAST(@C as FLOAT) / CAST(@D as FLOAT)
    
    SET @Answer = CASE WHEN @Answer - ROUND(@Answer, 0) > 0.00 THEN ROUND(@Answer, 0) + 1
                       ELSE ROUND(@Answer, 0) END
    
    PRINT @Answer
    

    编辑-更正舍入参数。到0

        7
  •  0
  •   Michael Riley - AKA Gunny    15 年前
    DECLARE @Count int
    SELECT @Count = COUNT(*) FROM #TempItems
    SELECT @TotalPages = @Count / @RecsPerPage 
    IF @Count % @RecsPerPage > 0 SET @TotalPages = @TotalPages +1
    
        8
  •  0
  •   datagod    14 年前

    保留原始公式,但需要检查余数是否为>0,如果是,则只需将1添加到结果中。

    推荐文章