Усечение в значениях округления SQL Server - PullRequest
0 голосов
/ 18 октября 2018

Я ищу способ усечь или удалить лишние десятичные разряды в SQL.Я нашел способ, но у меня проблема со значениями, которые не имеют 3 десятичных знака.

У меня есть следующие данные

ProductID   |  Price   |  Amount  
------------+----------+---------
   100      |  50.01   |   1
   101      |  25      |   0.789

Это очень просто, все, что мне нужносделать, это получить сумму по каждому продукту (цена * сумма).

Мой запрос:

select 
    [ProductID],
    [Price],
    [Amount],
    round(SUM(([Price] * [Amount])),2,1) as 'Total'
from 
    [Tables]

Что я получу:

ProductID  |   Price   |  Amount   |   Total
-----------+-----------+-----------+-----------
   100     |   50.01   |     1     |     50     <=======
   101     |     25    |   0.789   |    19.72

Итак, еслимой калькулятор работает, результат этой простой операции:

(50.01 * 1) = 50.01
-
(25 * 0.789) = 19.725
-

Вопрос : SQL делает трюк, отбрасывая 5 из 19,725, но почему (50.01 * 1) равно50?

Я знаю, что если я использую Round ((значение) , 2,0 ) , я получу 50,01, но если я сделаю это, 19,725 станет19.73, и это неправильно для моего заявления.

Что я могу сделать, чтобы это исправить?

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Если вы приведете цену и сумму к числовому или десятичному типу данных, как показано ниже, вы получите ожидаемый результат:

DECLARE @Tables table 
(
    ProductID int,
    Price float,
    Amount float
);

INSERT @Tables
  (ProductID, Price, Amount)
VALUES
  (100, 50.01, 1),
  (101, 25, 0.789);

SELECT ProductID
      ,Price
      ,Amount
      ,ROUND(SUM((CAST(Price AS decimal(5,2)) * CAST(Amount AS decimal(5,3)))),2,1) AS 'Total'
FROM @Tables
GROUP BY ProductID, Price, Amount;

(2 row(s) affected)
ProductID   Price                  Amount                 Total
----------- ---------------------- ---------------------- ---------------------------------------
100         50.01                  1                      50.01000
101         25                     0.789                  19.72000

(2 row(s) affected)
0 голосов
/ 18 октября 2018
SELECT ProductID,
       Price,
       Amount,
       CAST(SUBSTRING(CAST(CAST(Price * Amount AS decimal(18,3)) AS VARCHAR),0, LEN(CAST(CAST(Price * Amount AS decimal(18,3)) AS VARCHAR))) AS DECIMAL(18,2)) AS Total
FROM  [Tables]
...