Работает ли округление, если вы вызываете его для операции в скобках в SQL Server? - PullRequest
0 голосов
/ 25 апреля 2019

В принципе я не могу заставить метод округления работать.Я хочу округлить цену до 2 знаков после запятой;Я пытался следовать примерам, но это просто игнорируется.Поэтому я, должно быть, что-то упускаю.

Это то, что у меня есть до сих пор

SELECT TOP 100 
    CONVERT(varchar, pord.dt_created, 1) AS [Date Created], 
    pord_line.supplier AS [Supplier],  
    pord_line.ref_no AS [Purchase Order],
    pord_line.qty_received AS [Quantity Received], 
    pord_line.qty- pord_line.qty_received AS [Quantity Oustanding],
    pord.currency AS [Currency], 
    -- pord_line.price* pord_line.qty_received AS [Amount Received in Euros],
    -- pord_line.price * (pord_line.qty-pord_line.qty_received) AS [Amount Outstanding In euros]
    ROUND((pord_line.price * pord_line.qty_received), 2 )AS [Amount Received in Euros],
    ROUND(((pord_line.price * (pord_line.qty-pord_line.qty_received))), 2) AS [Amount Outstanding In euros]
FROM 
    pord_line (nolock)  
JOIN 
    pord ON pord_line.ref_no = pord.ref_no
WHERE 
    pord.dt_created BETWEEN '2015-10-08' AND '2015-11-08' ;  

Это следующий код, который не работает так, как я планировал

ROUND((pord_line.price * pord_line.qty_received), 2 )AS [Amount Received in Euros],
ROUND(((pord_line.price * (pord_line.qty-pord_line.qty_received))), 2) AS [Amount Outstanding In euros]

Image of results I get

Ответы [ 3 ]

1 голос
/ 25 апреля 2019

Вообще говоря, функция ROUND не изменяет тип данных;если входное выражение равно DECIMAL(18, 10), то результат также будет DECIMAL(18, 10):

SELECT ROUND(1.0153456789, 2) -- 1.0200000000

Если вы хотите ровно 2 цифры, приведите результат к DECIMAL(n, 2):

SELECT CAST(1.0153456789 AS DECIMAL(18, 2)) -- 1.02

ИВаш запрос станет:

CAST(pord_line.price *                  pord_line.qty_received  AS DECIMAL(18, 2)) AS [Amount Received in Euros],
CAST(pord_line.price * (pord_line.qty - pord_line.qty_received) AS DECIMAL(18, 2)) AS [Amount Outstanding In euros],
0 голосов
/ 25 апреля 2019

Округление работает, но вы получаете результат, например, десятичный (15,10) - точность 10.попробуйте привести ваш результат к десятичной (18,2)

CAST( ROUND( (pord_line.price * pord_line.qty_received), 2 ) as decimal(18,2)) AS [Amount Received in Euros]
CAST( ROUND( ((pord_line.price * (pord_line.qty-pord_line.qty_received))), 2) as decimal(18,2)  AS [Amount Outstanding In euros]
0 голосов
/ 25 апреля 2019

(Пожалуйста, не используйте изображения для отображения данных о переполнении стека для кода или данных)

Что касается вашего вопроса: раунд не формат .вы можете использовать format или попробовать cast :

 Cast(ROUND( (pord_line.price * pord_line.qty_received), 2 ) as Decimal(10,2))  AS [Amount Received in Euros],
...