Ошибка в вычислении Floor () из SQL - PullRequest
0 голосов
/ 06 сентября 2011

Мне нужно рассчитать количество денежных купюр, необходимых для подготовки зарплаты. У меня проблема с последним столбцом, т. Е. 1 доллар США.

Я хочу получить значение для USD1 = 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-запрос и выполнить его, тогда вы поймете, что я имею в виду. Надеюсь, что кто-нибудь может мне помочь с этим.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 06 сентября 2011

Многие ваши выражения могут быть упрощены, если вы понимаете, что вам не нужно вычитать вычисленные предыдущие суммы (единственное, для которого я не могу получить приличное выражение на данный момент, это USD10).Например, столбец USD1 всегда будет иметь значение от 0 до 4, основываясь на остатке от деления всей суммы на 5.

Это определение оператора по модулю, в SQL это%, поэтому мы можем иметь:

(CONVERT(int,@GrossPay)%5) as USD1

Как я уже сказал, большинство других также можно рассчитать с помощью модуля (кроме USD10, все еще пытаясь придумать упрощение)для этого).Я также ввел еще одну переменную под названием @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

Если кто-то еще может предложить хорошее короткое выражение для USD10, я думаю, что это сделано.

0 голосов
/ 06 сентября 2011

Рекомендуется использовать ROUND :

SELECT ROUND(2.78,0)

В качестве альтернативы, добавление 0.5 приведет к округлению floor вместо пола:

SELECT FLOOR(2.78+0.5)
...