【问题标题】:return all the value between two decimal value [duplicate]返回两个十进制值之间的所有值[重复]
【发布时间】:2018-03-07 13:56:50
【问题描述】:

我有两个具有十进制(15,2)数据类型的值

例如。

@from='19.99'

 @to='20.02'

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

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

【问题讨论】:

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


    【解决方案1】:

    您可以像下面这样使用 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

    【讨论】:

    • Msg 1060, Level 15, State 1, Line 9 TOP 子句中的行数必须是整数。
    • @Thebeginner 已更新。
    • 这行得通,但我们可以简化这个查询吗?
    • 这个有什么功能或者方法吗?
    【解决方案2】:

    试试:

    DECLARE @From DECIMAL (15,2) = 19.99;
    DECLARE @To DECIMAL (15,2) = 20.02;
    DECLARE @Step DECIMAL (15,2) = 00.01;
    DECLARE @R TABLE (Value DECIMAL(15,2));
    
    WHILE @From <= @To
        begin
            INSERT INTO @R VALUES (@From);
            SET @From = @From + @Step;
        End
    SELECT *
    FROM @R;
    

    结果:

    +=======+
    | 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 |
    +-------+
    

    【讨论】:

      【解决方案3】:

      您可以使用递归 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 行,则需要探索最大递归选项。

      您也可以对“数字”表执行类似操作。

      【讨论】:

      • 数字表方法很容易使用。使用递归 CTE 来计算 lile 是非常无用的。注意tgis文章:sqlservercentral.com/articles/T-SQL/74118
      • 只用简单的查询就可以吗?
      • 当我的 from 大于 to 时不返回正确的结果
      • 如何使用最大递归选项。
      猜你喜欢
      • 2016-05-03
      • 1970-01-01
      • 1970-01-01
      • 2019-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-05
      相关资源
      最近更新 更多