【问题标题】:Simultaneous result from single parameter SQL Server stored procedure单参数 SQL Server 存储过程的同时结果
【发布时间】:2016-08-29 07:36:33
【问题描述】:

我有以下 t-sql:

declare @startdate datetime, @finishdate datetime;
declare @declinerate float, @setpoint float;
declare @recoveredmw;

set @startdate = '2016-01-01';
set @finishdate = '2016-12-31'
set @declinerate = 0.0972 / 100;
set @setpoint = 98;
set @recoveredmw = @setpoint - 1;

;WITH ctetest AS 
(
    SELECT      
        @StartDate AS CDate, 
        @setpoint as Case2, 
        0 as OLNo

    UNION ALL

    SELECT      
        dateadd(day,1,CDate),
        CASE 
           WHEN Case2 < @recoveredMW THEN @setpoint 
                                     ELSE (1 - @declinerate1) * Case2 
        END,
        OLNo + (CASE WHEN Case2 < @recoveredMW THEN 1 ELSE 0 END)
    FROM        
        ctetest 
    WHERE       
        dateadd(day, 1, CDate) <= @finishdate
)
SELECT * 
FROM ctetest OPTION (MAXRECURSION 0)

那么结果应该是:

---------------------------------
CDate          Case2       OLNo
---------------------------------
2016-01-01     98          0
2016-01-02     97.9        0
2016-01-03     97.81       0
ff.
2016-12-30     97.62       30
2016-12-31     97.52       30

它根据@startdate@finishdate 参数创建从1 月1 日到12 月底的数据。

我想要的是同时创建一个@recoveredMW。假设@setpoint 是 98,那么它将创建上面的结果,即@recoveredMW 是从@setpoint 减去 1。在2016-12-31 之后,它会从头开始创建另一个原始数据,但@recoveredMW 是负2 等等。

结果样本:

---------------------------------
CDate          Case2       OLNo
---------------------------------
2016-01-01     98          0
2016-01-02     97.9        0
2016-01-03     97.81       0
ff.
2016-12-30     97.62       30
2016-12-31     97.52       30
2016-01-01     97          0        <-- New RawData after 2016-12-31, @recoveredMW-2
2016-01-02     96.91       0
2016-01-03     96.81       0
ff.
2016-12-31     96.53       30

有没有办法做到这一点?

谢谢。

【问题讨论】:

    标签: sql sql-server tsql stored-procedures sql-server-2008-r2


    【解决方案1】:

    在第一个锚成员之后将另一个锚成员添加到您的 ctetest

            SELECT      @startdate AS CDate, 
                        @setpoint - 1 as Case2, 
                        0 as OLNo
    

    如果您希望结果单独排序,请添加另一列以区分 @setpoint@setpoint - 1 的原始运行

    这是修改后的查询

    ;WITH ctetest AS 
            (
                SELECT      1 AS Data,   -- Added
                @startdate AS CDate, 
                            @setpoint as Case2, 
                            0 as OLNo
    
                UNION ALL
    
                SELECT      2 as Data,
                @startdate AS CDate, 
                            @setpoint - 1 as Case2, 
                            0 as OLNo
    
                UNION ALL
    
                SELECT      Data,
                dateadd(day,1,CDate),
                            CASE WHEN Case2 < @recoveredmw THEN @setpoint ELSE (1 - @declinerate) * Case2 END,
                            OLNo + (CASE WHEN Case2 < @recoveredmw THEN 1 ELSE 0 END)
                FROM        ctetest 
                WHERE       dateadd(day, 1, CDate) <= @finishdate
            )
            SELECT      * 
            FROM        ctetest 
        order by    Data, CDate
        OPTION (MAXRECURSION 0)
    

    编辑 1:

    ;WITH 
    numbers AS          -- added
    (
        SELECT  n = 1
        UNION ALL
        SELECT  n = n + 1
        FROM    numbers
        WHERE   n < 999
    ),
    ctetest AS 
            (
                SELECT      n AS Data,                   -- change
                @startdate AS CDate, 
                            CAST (n as FLOAT) as Case2,   -- change
                            0 as OLNo
            FROM        numbers                           -- change
            WHERE   n   <= @setpoint                 -- change
    
                UNION ALL
    
                SELECT      Data,
                dateadd(day,1,CDate),
                            CASE WHEN Case2 < @recoveredmw THEN @setpoint ELSE (1 - @declinerate) * Case2 END,
                            OLNo + (CASE WHEN Case2 < @recoveredmw THEN 1 ELSE 0 END)
                FROM        ctetest 
                WHERE       dateadd(day, 1, CDate) <= @finishdate
            )
            SELECT      * 
            FROM        ctetest 
        order by    Data DESC, CDate     -- change
        OPTION (MAXRECURSION 0)
    

    【讨论】:

    • 那很好,但我希望同时恢复 mw 直到 1。答案是直到 96。
    • 伙伴...太棒了。干杯,:)
    • 我正在为数字表使用递归 cte。为了获得更好的性能,请将其构建为永久表。搜索 Tally / Number table,有很多参考资料
    猜你喜欢
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多