2016-08-23 9 views
1

だが、私はこのようになりますテーブルがあるとしましょう条件に基づいて、最後に割り当てられた値を拾うことができます:私はと呼ばれる列を持つビューを作成しようとしていますSQL Server 2012のは:IIF関数は

+---------+-----------+------------+ 
| Company | Quantity |  Date | 
+---------+-----------+------------+ 
| A  |  10000 | 2016-08-01 | 
| B  |  -5000 | 2016-08-01 | 
| C  |  5000 | 2016-08-01 | 
| A  |  5000 | 2016-08-02 | 
| B  |  -2500 | 2016-08-02 | 
| C  |  5000 | 2016-08-02 | 
| A  |   0 | 2016-08-03 | 
| B  |   0 | 2016-08-03 | 
| C  |  5000 | 2016-08-03 | 
+---------+-----------+------------+ 

IssuerLSここで、数量が+ veの場合、列の値は「L」になり、量が-veの場合、列の値は「S」になります。その部分はIIF関数では簡単ですが、私はまた、数量が0の場合は最後の既知の値を使用したいので、私の見解は次のようになります。

+---------+----------+------------+----------+ 
| Company | Quantity | Date | IssuerLS | 
+---------+----------+------------+----------+ 
| A  | 10000 | 2016-08-01 | L  | 
| B  | -5000 | 2016-08-01 | S  | 
| C  |  5000 | 2016-08-01 | L  | 
| A  |  5000 | 2016-08-02 | L  | 
| B  | -2500 | 2016-08-02 | S  | 
| C  |  5000 | 2016-08-02 | L  | 
| A  |  0 | 2016-08-03 | L  | 
| B  |  0 | 2016-08-03 | S  | 
| C  |  5000 | 2016-08-03 | L  | 
+---------+----------+------------+----------+ 

をするIIF関数を取得行う方法はあります数量が0の場合、各会社に最後に知られた 'L'または 'S'値を使用しますか?

ありがとうございました。

+0

(IIF)のみ、その入力の値を見ています。 'iif(somecondition、truevalue、falsevalue)'。 iif()ではなく、 'somecondition'のロジックを指定する必要があります。 –

+0

最後の既知の値に基づいてLとSを追加するロジックは何ですか – TheGameiswar

+0

したがって、たとえばA社の場合、Quantity = 0の場合、数量が0でない最後の既知の日付に戻ります(この場合は2016-08 -02)、その日の数量に応じて「L」または「S」を追加します(この場合は「L」)。 – MilesToGoBeforeISleep

答えて

1
;with cte 
    as 
    (select *, 
    case 
    when qty>0 then 'l' 
    when qty<0 then 'S' 
    else null end as newval 
    from #tmp 
    ) 
    select c1.cmp,c1.qty,c1.date, 
    case when newval is null then rplcval else newval end as somecol 
     from cte c1 
    cross apply 
    (
    select top 1 newval as rplcval from cte c2 where c2.date<=c1.date and c1.cmp = c2.cmp 
order by date) b 
+0

ご協力ありがとうございます。これも同様に機能しました。 – MilesToGoBeforeISleep

1

は、ケースとアウターを使用して適用できます。

SELECT *, 
     CASE WHEN Quantity = 0 THEN CASE WHEN prevQuantity > 0 THEN 'L' ELSE 'S'END 
      ELSE CASE WHEN Quantity > 0 THEN 'L' ELSE 'S' END 
     END 
FROM Table1 t1 
     OUTER APPLY (SELECT TOP 1 
          Quantity prevQuantity 
        FROM Table1 t2 
        WHERE t2.Company = t1.Company 
          AND t2.Date < t1.Date 
          AND t2.Quantity <> 0 
        ORDER BY [Date] DESC 
        ) t2 

あなたはIIFを使用したい場合は、その後

SELECT *, 
     IIF(Quantity <> 0, IIF(Quantity > 0, 'L','S'), IIF(prevQuantity > 0, 'L','S')) 
FROM Table1 t1 
     CROSS APPLY (SELECT TOP 1 
          Quantity prevQuantity 
        FROM Table1 t2 
        WHERE t2.Company = t1.Company 
          AND t2.Date <= t1.Date 
          AND t2.Quantity <> 0 
        ORDER BY [Date] DESC 
        ) t2 
+0

ありがとうございます。私は両方を試み、両方とも働いた。私は彼らに慣れていないので、OUTER APPLYとCROSS APPLYを読まなければなりません。 – MilesToGoBeforeISleep