我想使用 select 语句从 3661 记录表中获取 10%。但是我得到了 367 条记录,但我只想要 366 条记录;但是当我投入 50% 时,我想获得 1831 条记录,而不是 1830 条记录。这是我使用的声明:
SELECT top 10 percent *
FROM table_a
我想使用 select 语句从 3661 记录表中获取 10%。但是我得到了 367 条记录,但我只想要 366 条记录;但是当我投入 50% 时,我想获得 1831 条记录,而不是 1830 条记录。这是我使用的声明:
SELECT top 10 percent *
FROM table_a
不幸的是,这就是该TOP x PERCENT
子句的工作方式(突出显示相关部分):
百分
指示查询仅返回结果集中第一个表达式百分比的行。小数值向上舍入到下一个整数值。
如果您想要不同的舍入方案,则必须自己进行计算:
SELECT TOP (SELECT COUNT(*) / 10 FROM table_a) * FROM table_a
这将使用整数除法,它会截断小数部分,即向下舍入。
由于您希望 3661 的 50% 产生 1831,我猜您想要“四舍五入”,您可以使用以下ROUND
函数获得:
SELECT TOP (SELECT CONVERT(int, ROUND(COUNT(*) / 10.0, 0)) FROM table_a) * FROM table_a
请注意,要强制进行浮点除法而不是整数除法10.0
,则需要代替。10
以下是 MSDN Page for SQL Server 2012 TOP PERCENT 参数的描述:
指示查询仅返回结果集中第一个表达式百分比的行。小数值向上舍入到下一个整数值。
但是,TOP 页面的 SQL Server 2005 版本不包括关于小数值被四舍五入的第二句。我会假设行为是相同的(部分基于你的轶事证据),MSDN 添加它是因为人们询问/抱怨这种行为。