返回两个十进制值之间的所有值

时间:2017-09-26 11:08:27

标签: sql sql-server database sql-server-2008 tsql

我有两个值,其中包含十进制(15,2)数据类型

例如

@from='19.99'

 @to='20.02'

我必须返回两个值之间的范围

预期输出 - 19.99, 20.00, 20.01, 20.02

3 个答案:

答案 0 :(得分:4)

您可以使用Tally / Number方法,如下所示

DECLARE @from DECIMAL(10,2) , @to DECIMAL(10,2), @interval DECIMAL(10,2)

SET @from=19.99
SET @to= 20.02
SET @interval=0.01
SELECT @from +r*@interval 
FROM
(
SELECT TOP (SELECT CAST((@to-@from)/@interval AS INT)+1)
ROW_NUMBER() OVER( ORDER BY (SELECT 1)) -1  r
FROM 
sys.objects s1 CROSS JOIN sys.objects s2
)T

Working demo

答案 1 :(得分:2)

尝试:

+=======+
| Value |
+=======+
| 19,99 |
+-------+
| 20,00 |
+-------+
| 20,01 |
+-------+
| 20,02 |
+-------+

结果:

CTE

使用DECLARE @From DECIMAL (15,2) = 19.99; DECLARE @To DECIMAL (15,2) = 20.02; DECLARE @Step DECIMAL (15,2) = 00.01; WITH CTE AS( SELECT @Step * 1 Val UNION ALL SELECT @Step * 2 UNION ALL SELECT @Step * 3 UNION ALL SELECT @Step * 4 ) SELECT @From - @Step + CTE.Val Value FROM CTE;

+=======+
| Value |
+=======+
| 19,99 |
+-------+
| 20,00 |
+-------+
| 20,01 |
+-------+
| 20,02 |
+-------+

结果:

{{1}}

答案 2 :(得分:1)

您可以使用递归CTE:

with cte as (
      select @from as val
      union all
      select cast(val + 0.01 as decimal(15,2))
      from cte
      where density < @to
     )
select val
from cte
option (MAXRECURSION 0);

注意:如果要插入的行数超过100行,则需要探索max recursion选项。

你也可以用“数字”表做类似的事情。