从SQL计算Floor()时出错

从SQL计算Floor()时出错,sql,floor,Sql,Floor,我需要计算工资准备所需的钞票数量。 我对最后一列有问题,即1美元 我将获得1美元=2的值 DECLARE @GrossPay Decimal(12,2) SET @GrossPay = 132.78 SELECT @GrossPay, FLOOR(@GrossPay/100) AS USD100, FLOOR((@GrossPay - FLOOR(@GrossPay/100)*100)/50) AS USD50, FLOOR((@GrossPay - FLOOR

我需要计算工资准备所需的钞票数量。 我对最后一列有问题,即1美元

我将获得1美元=2的值

DECLARE @GrossPay Decimal(12,2)
SET @GrossPay = 132.78

SELECT
    @GrossPay,
    FLOOR(@GrossPay/100) AS USD100,
    FLOOR((@GrossPay - FLOOR(@GrossPay/100)*100)/50) AS USD50,
    FLOOR((@GrossPay - FLOOR(@GrossPay/100)*100 -(FLOOR((@GrossPay - FLOOR(@GrossPay/100)*100)/50))*50)/20) AS USD20,
    FLOOR((@GrossPay - FLOOR(@GrossPay/100)*100 -(FLOOR((@GrossPay - FLOOR(@GrossPay/100)*100)/50))*50 - (FLOOR((@GrossPay - FLOOR(@GrossPay/100)*100 -(FLOOR((@GrossPay - FLOOR(@GrossPay/100)*100)/50))*50)/20))*20)/10) AS USD10,
FLOOR((@GrossPay - FLOOR(@GrossPay/100)*100 -(FLOOR((@GrossPay - FLOOR(@GrossPay/100)*100)/50))*50 - (FLOOR((@GrossPay - FLOOR(@GrossPay/100)*100 -(FLOOR((@GrossPay - FLOOR(@GrossPay/100)*100)/50))*50)/20))*20 -(FLOOR((@GrossPay - FLOOR(@GrossPay/100)*100 -(FLOOR((@GrossPay - FLOOR(@GrossPay/100)*100)/50))*50 - (FLOOR((@GrossPay - FLOOR(@GrossPay/100)*100 -(FLOOR((@GrossPay - FLOOR(@GrossPay/100)*100)/50))*50)/20))*20)/10))*10)/5) AS USD5,
FLOOR((@GrossPay - FLOOR(@GrossPay/100)*100 -(FLOOR((@GrossPay - FLOOR(@GrossPay/100)*100)/50))*50 - (FLOOR((@GrossPay - FLOOR(@GrossPay/100)*100 -(FLOOR((@GrossPay - FLOOR(@GrossPay/100)*100)/50))*50)/20))*20 -(FLOOR((@GrossPay -
FLOOR(@GrossPay/100)*100 -(FLOOR((@GrossPay - FLOOR(@GrossPay/100)*100)/50))*50 - (FLOOR((@GrossPay - FLOOR(@GrossPay/100)*100 -(FLOOR((@GrossPay - FLOOR(@GrossPay/100)*100)/50))*50)/20))*20)/10))*10-(FLOOR((@GrossPay - FLOOR(@GrossPay/100)*100 -(FLOOR((@GrossPay - FLOOR(@GrossPay/100)*100)/50))*50 - (FLOOR((@GrossPay -
FLOOR(@GrossPay/100)*100 -(FLOOR((@GrossPay - FLOOR(@GrossPay/100)*100)/50))*50)/20))*20 -(FLOOR((@GrossPay - FLOOR(@GrossPay/100)*100 -(FLOOR((@GrossPay - FLOOR(@GrossPay/100)*100)/50))*50 - (FLOOR((@GrossPay -
FLOOR(@GrossPay/100)*100 -(FLOOR((@GrossPay - FLOOR(@GrossPay/100)*100)/50))*50)/20))*20)/10))*10)/5))*5)/1) AS USD1
抱歉这么长时间的询问

您可以复制并粘贴上面的Sql查询并执行它,这样您就理解了我的意思。希望有人能帮我

提前谢谢

考虑使用:

或者,添加
0.5
将使
floor
四舍五入,而不是floor:

SELECT FLOOR(2.78+0.5)

如果你意识到你不需要减去之前计算的金额,你的很多表达式都可以简化(目前我唯一找不到合适的表达式是
10美元
)。例如,
USD1
列始终是一个介于0和4之间的值,基于将整个金额除以5的剩余部分

这是模运算符的定义,在SQL中,这是,因此我们可以有:

(CONVERT(int,@GrossPay)%5) as USD1
正如我所说,其他大部分也可以通过使用模来计算(除了10美元,仍在试图对此进行简化)。我还引入了另一个变量,称为
@GrossPayInt
,因为它自动处理舍入:

DECLARE @GrossPay Decimal(12,2) SET @GrossPay = 132.78
DECLARE @GrossPayInt int SET @GrossPayInt = @GrossPay

SELECT @GrossPay,
    @GrossPayInt/100 as USD100,
    (@GrossPayInt%100)/50 as USD50,
    (@GrossPayInt%50)/20 as USD20,
    CASE WHEN (@GrossPayInt%100)/10 IN (1,3,6,8) THEN 1 ELSE 0 END as USD10 as USD10,
    (@GrossPayInt%10)/5 as USD5,
    (@GrossPayInt%5) as USD1

如果有人能建议10美元的短表达式,我想这已经完成了。

Ummm….如果你得到
floor(2.78)==2
,那么
floor
函数的工作原理与预期完全一样。请保留返回3的选择部分,只有bozotron才能读取你的代码,无意冒犯:)在你开始思考一定有更好的方法来解决这个问题之前,你需要输入多少次“地板”这个词?谢谢大家给我上的好课,谢谢!
DECLARE @GrossPay Decimal(12,2) SET @GrossPay = 132.78
DECLARE @GrossPayInt int SET @GrossPayInt = @GrossPay

SELECT @GrossPay,
    @GrossPayInt/100 as USD100,
    (@GrossPayInt%100)/50 as USD50,
    (@GrossPayInt%50)/20 as USD20,
    CASE WHEN (@GrossPayInt%100)/10 IN (1,3,6,8) THEN 1 ELSE 0 END as USD10 as USD10,
    (@GrossPayInt%10)/5 as USD5,
    (@GrossPayInt%5) as USD1