Показывать числа с десятичными знаками только в том случае, если они не следуют в нуле - PullRequest
0 голосов
/ 17 января 2020

Таблица:

DECLARE @tab TABLE (p1 decimal(9,2), p2 decimal(9,2))
INSERT INTO @tab VALUES (10.5,9),(2,4),(10.5,9.5),(40,90),(10,9.56)

Запрос:

select IIF(FLOOR(p1) <> CEILING(p1) OR FLOOR(p2) <> CEILING(p2),CAST(p1 AS VARCHAR)+'-'+CAST(p2 AS VARCHAR), CAST( CAST(p1 AS int) as varchar)+'-'+cast( CAST(p2 AS int) as varchar)) AS Data from @tab

Вывод:

enter image description here

Я хочу показывать в десятичном виде, только если десятичное значение не равно нулю или больше нуля. Мои первые данные 10.5 и 9, я хочу показать их как 10.50-9, но они показывают как 10.50-9.00.

Ответы [ 2 ]

1 голос
/ 17 января 2020

Вы должны обрабатывать форматирование по столбцам перед их объединением. Используя ваш код, я изменил его на

DECLARE @tab TABLE (p1 decimal(9,2), p2 decimal(9,2))
INSERT INTO @tab VALUES (10.5,9),(2,4),(10.5,9.5),(40,90),(10,9.56)

SELECT IIF(FLOOR(p1)<> CEILING(p1),CAST(p1 AS VARCHAR),CAST( CAST(p1 AS int) as varchar)) +'-'+ 
IIF(FLOOR(p2)<> CEILING(p2),CAST(p2 AS VARCHAR),CAST( CAST(p2 AS int) as varchar)) as Data1 FROM @tab;

Демо

1 голос
/ 17 января 2020

Пока у вас есть одно условие (IIF) для двух столбцов вместе. Вместо этого вам нужны отдельные условия:

select
  case when floor(p1) <> ceiling(p1) then 
    cast(p1 as varchar)
  else
    cast(cast(p1 as int) as varchar)
  end +
  '-' +
  case when floor(p2) <> ceiling(p2) then
    cast(p2 as varchar)
  else
    cast(cast(p2 as int) as varchar)
  end as data
from @tab;

(я заменил проприетарный IIF T SQL на стандартный SQL s CASE WHEN здесь, но вы также можете использовать IIF конечно.)

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

case when floor(p1) <> ceiling(p1) then 
  str(p1, 10, 2)
else
  str(p1, 10, 0)
end

STR (float_expression [, length [, десятичное число]])

...