如何获取T-SQL中小数点数最多的货币记录?

How to get money record with most decimals in T-SQL?

如何从具有最多 "active" 小数点的列中获取货币记录。例如,从列表 (0.010.01120.001) 中,结果应该是 0.0112.

我的第一个想法是将值转换为varchar并获得最大长度的记录。但这没有用,因为如果我不希望它四舍五入,我必须指定长度。这是脚本:

SELECT CONVERT(VARCHAR, CAST(Value as DECIMAL(18, 6))) FROM Table

也许是这样的:

DECLARE @tbl TABLE(ID INT IDENTITY, YourValue MONEY, Explanation VARCHAR(150));
INSERT INTO @tbl VALUES
 (0.0,'just zero')
,(0.1,'1 decimal in 0.1')
,(1.1,'1 decimal in 1.1')
,(-1.1,'1 decimal in -1.1')
,(123456789.1,'1 decimal in 123456789.1')
,(1.1234,'4 decimals in 1.1234')
,(1.12345,'4 decimals in 1.12345'); --5 is rounded implicitly

--您不需要所有列,我只是放置它们以可视化中间步骤

SELECT * 
      ,YourValue % 1 AS TrickWithModulo
      ,ABS(YourValue)-FLOOR(ABS(YourValue)) AS MathSolution
      ,CAST(ABS(YourValue) % 1 AS FLOAT) AS ConvertedToFloat_no_trailin_zeros
      ,SUBSTRING(CONVERT(VARCHAR(100),CAST(ABS(YourValue) % 1 AS FLOAT)),3,100) JustTheDecimals
      ,LEN(SUBSTRING(CONVERT(VARCHAR(100),CAST(ABS(YourValue) % 1 AS FLOAT)),3,100)) Length_of_JustTheDecimals
FROM @tbl
ORDER BY Length_of_JustTheDecimals DESC;

想法是

  • 获取小数部分
  • 将其用作字符串
  • 去掉前导0.
  • 获取剩余数字的长度
  • 对结果集进行排序,使 最长 位小数位于顶部