SQL Server: удалить конечные 0 после десятичной точки. тип данных nvarchar

Я пишу SQL-запрос, возвращающий валовую оплату из двух отдельных таблиц. Суммы в обеих таблицах nvarchar тип данных. В одной таблице у меня есть "150,0000", а в другой у меня есть "150", есть ли способ удалить трейлинг 0? Вот мой код

SELECT DISTINCT
    s.EEid,
    s.Gross AS 'S Gross',
    pr.EEid,
    pr.Gross AS 'PR Gross'
FROM 
    starPayHistory s
INNER JOIN 
    payRunPayHistory pr ON pr.EEid = s.EEid
ORDER BY 
    s.EEid

Результаты запроса

Результаты запроса выше

Я пробовал эту строку кода, чтобы обрезать ведущие 0, но он возвращает "15". это удаляет все 0.

Вот код

REPLACE(ltrim(REPLACE(s.Gross,'0','')), ' ', '0') AS 'S Gross'

Результат из этой строки кода

Результаты от ЗАМЕНА

Любая помощь будет принята с благодарностью!

3 ответа

Решение
DECLARE @x as varchar(32) = '653710000.01';

--note rounding error occurs
select CAST(CAST(@x As FLOAT) AS NVARCHAR(32));

--how to break this one?
select 
        CASE WHEN PATINDEX('%[.]%',REVERSE(@x)) = PATINDEX('%[123456789.]%',REVERSE(@x)) 
            THEN 
                   LEFT(@x, LEN(@X) - PATINDEX('%[.]%',REVERSE(@x))) 
            ELSE  

                CASE WHEN PATINDEX('%[.]%',REVERSE(@x)) > 0 
                    THEN 
                        LEFT(@x, 1 + LEN(@X) - PATINDEX('%[123456789.]%',REVERSE(@x)))  
                    ELSE
                        @X
                    END
            END  ;

Попробуй это:

CAST(CAST(s.Gross As FLOAT) AS NVARCHAR(32))

Но если у вас есть контроль над таблицей, обратите внимание, что несколько комментариев по вашему вопросу говорят, что было бы лучше хранить как числовые. И не то, чтобы это использовало преимущество числовой работы с ним. Так что, если вы можете, подумайте об изменении типа на столе, и я согласен с другими, проблема просто исчезнет.

Я бы не рекомендовал переходить на floatпотому что это может иметь непредвиденные последствия, потому что float не точное представление. Вы можете просто использовать строковые операции. Например:

select (case when s.gross like '%.%'
             then replace(rtrim(replace(s.gross, '0', ' ')), ' ', '0')
             else s.gross
        end)

Например, попробуйте запустить эту базу данных db<> fiddle.

Другие вопросы по тегам