2016-05-04 20 views
0

から同時結果に私は、次のT-SQLを持っている:単一のパラメータSQL Serverのストアドプロシージャ

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 

それはまで1月1日からのデータを作成し、 12月末は@startdate@finishdateです。

私が欲しいのは、同時に@recoveredMWを作成することです。例えば、@setpointが98であるとすると、上記の結果は、から@recoveredMWがマイナス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 

はこれを行う方法はありますか?

ありがとうございます。

答えて

1

あなたは結果を個別に注文したい場合は、ここで@setpoint - 1

から@setpointでオリジナルの実行を区別するために別の列を追加し、最初のアンカー部材

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

後にctetestに別のアンカー部材を追加変更されたクエリ

;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) 

EDIT 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) 
+0

それは良いですが、私は同時にrecovermwを1にする必要があります。答えは96までです。 – Haminteu

+0

変更されました。 EDIT 1 – Squirrel

+0

を参照してください...それは最高です。乾杯、:) – Haminteu

関連する問題