仅当数字后面不为零时才显示带小数位的数字

Show numbers with decimal places only when they are not followed in zero

Table:

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

输出:

我只想在十进制值不为零或大于零的情况下以十进制显示。我的第一个数据 10.5 和 9,我想显示为 10.50-9,但显示为 10.50-9.00。

到目前为止,您在两列的组合上有一个条件 (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;

(我在这里用标准 SQL 的 CASE WHEN 替换了 TSQL 的专有 IIF,但您也可以使用 IIF当然。)

更常见的是,您会使用 STR 将数字显式转换为具有所需小数位数的字符串:

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

STR ( float_expression [ , 长度 [ , 十进制 ] ] )

您应该在连接它们之前按列处理格式。使用您给定的代码,我将其修改为

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;

Demo