【问题标题】:Sort Order on column with multiple decimal places对具有多个小数位的列进行排序
【发布时间】:2013-06-23 21:03:33
【问题描述】:

我正在使用 SQL Server 2008 R2 和 Crystal Reports XI

我有一个 nvarchar 类型的字段

它包含一本书的内容,所以数据就像

1 
3.3
1.1
4.5.6
1.4.3.1.1
11.2
....

我将如何对该列进行排序,使其在报告中显示为

1
1.1
1.4.3.1.1
3.3
4.5.6
11.2
...

【问题讨论】:

  • 尝试实现一个标量 CLR 函数...您可以找到一种可能的实现 here

标签: sql-server-2008 crystal-reports


【解决方案1】:

可以通过将值转换为hierarchyid,在 T-SQL 中对它们进行排序:

SELECT *
FROM (
  VALUES
    ('1'),
    ('3.3'),
    ('1.1'),
    ('4.5.6'),
    ('1.4.3.1.1'),
    ('11.2')
) v (version)
ORDER BY
  CAST('/' + version + '/' AS hierarchyid)
;

请参阅此SQL Fiddle 进行演示。

【讨论】:

  • 太棒了。我忘记了这个 2008 年的新数据类型。
【解决方案2】:

如果您知道最大小数位数,那么您可以将字符串分成几部分并单独排序。例如,如果您知道最多只能有 4 个小数(分隔 5 个不同的数字),那么您可以创建 5 个公式,每个公式代表一段字符串。

//Formula {@Num1} to isolate most significant number
local stringvar array splitString := split({table.string},'.');
if isnumeric(splitString[1]) then tonumber(splitString[1]) else 0

//...and the formula {@Num2} for second most significant number
local stringvar array splitString := split({table.string},'.');
if ubound(splitString)>1 and isnumeric(splitString[2])
  then tonumber(splitString[2]) else 0

现在先按{@Num1} 对您的报告进行排序,然后按{@Num2} 等排序。

【讨论】:

  • 感谢您的回复 - 这本来是完美的,但小数位数不固定。
  • 小数位数不需要固定,只需要知道最大小数位数即可。如果特定行不存在小数点,请使用 0,它仍然会正确排序。例如,字符串“11.2”将被排序为 11.2.0.0.0
  • 是的 - 这就是我的意思(对不起)......最大的小数位数不是一个常数。我可以确定将其设置为高(比如 20 左右) - 但有没有办法解决这个问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-01
  • 1970-01-01
  • 2015-12-14
  • 2016-05-03
  • 1970-01-01
  • 1970-01-01
  • 2016-04-15
相关资源
最近更新 更多