SQL Вывод запроса - десятичное размещение, слишком много целых чисел - PullRequest
0 голосов
/ 21 апреля 2020

У меня правильно работает запрос, я объединяю две таблицы, удаляю дубликаты и сохраняю данные с самой последней датой вступления в силу.

Таблицы выглядят так:

1.TAX_TABLE---------    
tax_id  description

        1   AZ State
        2   AZ-Maricopa Co
        4   AZ-Maricopa/Mesa



2.Tax_RATE_TABLE-------
tax_id  effective_date  tax_percent

1   2015-01-01 00:00:00.000 5.6
2   2015-01-01 00:00:00.000 0.7
4   2015-01-01 00:00:00.000 1.75
4   2019-03-01 00:00:00.000 2

Мой текущий запрос выглядит следующим образом:

use lhsitedb
select t.tax_id, t.description, tr.effective_date, tr.tax_percent
from dbo.tax t
inner join dbo.tax_rate tr on tr.tax_id = t.tax_id
where tr.effective_date = (
    select max(tr1.effective_date)
    from dbo.tax_rate tr1
    where tr1.tax_id = tr.tax_id

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

Примечание. Этот запрос прекрасно работает при выполнении в SSMS, однако я использую sqlcmd и экспортировал этот файл в файл .txt, в котором производятся эти неожиданные результаты.

tax_id                description                     effective_date          tax_percent             
--------------------- ------------------------------- ----------------------- ------------------------
                    4 AZ-Maricopa/Mesa                2019-03-01 00:00:00.000                        2
                    2 AZ-Maricopa Co                  2015-01-01 00:00:00.000      0.69999999999999996
                    1 AZ State                        2015-01-01 00:00:00.000       5.5999999999999996

(17 rows affected)

Когда этот столбец должен выглядеть следующим образом:

         tax_percent  
   ----------------------------
                   2 
                   1.75 

Ответы [ 4 ]

2 голосов
/ 21 апреля 2020

обновил мой ответ, чтобы использовать функцию CONVERT ...

Я бы попробовал использовать функцию CONVERT .. попробуйте! 2 будет указывать сотые. CONVERT(DECIMAL(10,2),tr.tax_percent) as 'tax_percent'

use lhsitedb
select t.tax_id, t.description, tr.effective_date, 
CONVERT(DECIMAL(10,2),tr.tax_percent) AS 
'tax_percent' 
from dbo.tax t
inner join dbo.tax_rate tr on tr.tax_id = t.tax_id
where tr.effective_date = (
    select max(tr1.effective_date)
    from dbo.tax_rate tr1
    where tr1.tax_id = tr.tax_id
1 голос
/ 21 апреля 2020

Из документов: "Данные с плавающей запятой являются приблизительными; поэтому не все значения в диапазоне типов данных могут быть представлены точно." И float, и real подвержены некоторым странностям отображения .

Я бы попробовал явный CAST. Что-то вроде:

use lhsitedb
select 
  t.tax_id, 
  t.description, 
  tr.effective_date, 
  CAST(tr.tax_percent AS decimal(18,2)) AS tax_percent --<-- The only change is here.
from dbo.tax t
inner join dbo.tax_rate tr on tr.tax_id = t.tax_id
where tr.effective_date = (
    select max(tr1.effective_date)
    from dbo.tax_rate tr1
    where tr1.tax_id = tr.tax_id
1 голос
/ 21 апреля 2020

Во-первых, вы можете упростить ваш запрос, используя apply.

Во-вторых, вы можете хранить значения как float с, а не decimal / numeric. Ну, вы можете исправить это на выходе:

select t.tax_id, t.description, tr.effective_date,
       round(tr.tax_percent, 2)
from dbo.tax t cross apply
     (select top (1) tr.*
      from dbo.tax_rate tr 
      where tr.tax_id = t.tax_id
      order by tr.effective_date desc
     ) tr
0 голосов
/ 21 апреля 2020

Вы можете использовать str ()

https://docs.microsoft.com/en-us/sql/t-sql/functions/str-transact-sql?redirectedfrom=MSDN&view=sql-server-ver15

str(your_value, 3, 2);  


select t.tax_id, t.description, tr.effective_date, str(tr.tax_percent,3,2)
...