Как использовать «МЕЖДУ» в CASE - PullRequest
0 голосов
/ 11 сентября 2018

Я создал скалярную функцию, которая должна преобразовывать знак учащегося в букву, я использовал CASE & Between для переключения значений следующим образом:

ALTER FUNCTION [GetLetterGrade] 
(
    @avg decimal ,
    @isCommented bit
)
RETURNS Char(50)
AS
BEGIN
return case WHEN @isCommented = 0   THEN    
            CASE
            when @avg between 97 And 100 THEN '01'
            when @avg Between  93 And 97 THEN '02'
            when @avg Between  90 And 93 THEN '03'
            when @avg Between  87 And 90 THEN '04'
            when @avg Between  83 And 87 THEN '05'
......

Функция переходит от одного случая к другому на 96,5 вместо 97 и на 92,5 вместо 93 и так далее, любая идея?

[Sample]

Пожалуйста, помогите

Ответы [ 3 ]

0 голосов
/ 11 сентября 2018

Вы можете попробовать, как показано ниже

return case WHEN @isCommented = 0   
                THEN  (  
                CASE
                when @avg >=97 And @avg <=100 THEN '01'
                when @avg >=93 And @avg <97 THEN '02'
                when @avg >= 90 And @avg < 93 THEN '03'
                when @avg >=  87 And @avg < 90 THEN '04'
                when @avg >=  83 And @avg < 87 THEN '05'
0 голосов
/ 11 сентября 2018

Согласно документам выражение expr BETWEEN min AND max эквивалентно (expr <= max AND expr >= min) только тогда, когда все три аргумента имеют одинаковый тип. В противном случае преобразование типов применяется ко всем аргументам. Во время этого преобразования могут возникнуть ошибки округления.

Для вашего случая я бы предложил округлить ВНИЗ, используя FLOOR.

when FLOOR(@avg) between 97 And 100 THEN '01'

0 голосов
/ 11 сентября 2018

Масштаб по умолчанию для десятичной дроби равен 0, поэтому при вызове функции происходит округление.

Кроме того, вам не нужно between, потому что заказаны условия case. Итак, я бы порекомендовал попробовать:

ALTER FUNCTION [GetLetterGrade] (
    @avg decimal(10, 2) ,
    @isCommented bit
) RETURNS Char(50)
AS BEGIN
    return (case when @isCommented = 0     
                 then (case when @avg >= 97 then '01'
                            when @avg >= 93 then '02'
                            when @avg >= 90 then '03'
                            when @avg >= 87 then '04'
                            when @avg >= 83 then '05'
             ......
END;
...