2016-06-16 25 views
0

私がしたいことの結果のグラフを表示する方法はわかりませんが、私が何をしようとしているのかを見てください。私は、rcが '098000'または '999998'にあるrcnew列を作成しようとしています。rcが '098000'または '999998'にない最も近い以前のpaydateからrcに変更します。ご覧のように、私のコードはpaydateが等しい場所です。なぜなら、これについてどうやって行くのか分からないからです。均等な給料日がない場合、私は先祖のものを取りたい。以下の結果におけるNULLは、あなたが「最も近い前のpaydateからrc」を意味している場合は、LAG機能を使用することができます200000日付を検索する

ern rc  paydate  rcnew 
123 098000 20151221 NULL 
123 200000 20151214 200000 
456 098000 20151221 200000 
456 200000 20151221 200000 



    SELECT 
    ern, rc, paydate, 
    CASE WHEN fss1.rc in ('098000', '999998') 
     THEN (SELECT TOP 1 rc 
       FROM [FIN_DataMart].[dbo].[FSSpaydetl] fss 
       WHERE fss.ern = fss1.ern 
       AND rc not in ('098000', '999998') 
       AND fss.paydate = fss1.paydate 
       ORDER BY paydate DESC) 
     ELSE fss1.rc 
    END rcnew 
FROM [FIN_DataMart].[dbo].[FSSpaydetl] fss1 

GROUP BY ern, rc, paydate 
ORDER BY ern, paydate desc 

答えて

1

lag()は動作しません。代替はです:

select fss.ern, rss.rc, fss.paydate, 
     (case when fss.rc in ('098000', '999998') then fss2.rc else fss.rc end) 
from FIN_DataMart].[dbo].[FSSpaydetl] fss outer apply 
    (select top 1 t2.* 
     from FIN_DataMart].[dbo].[FSSpaydetl] fss fss2 
     where fss2.paydate < fss2.paydate and 
      fss2.ern = fss.ern and 
      fss2.rc not in ('098000', '999998') 
     order by fss2.paydate desc 
    ) fss2; 
+0

私はあなたが彼の質問はおそらく書くことを意味していることが正しいと考えている彼のコードで大漁「RCは 『098000』または 『999998』ではない、最も近い前のpaydateを」しかし、彼は – Matt

+0

はい、それはですしませんでした私は何を入れようとしたのですか?しかし、私は外からの応募を試み、あなたに戻ってきます。ありがとう! – ajc101

+0

これはbtwで動作しました。ありがとう! – ajc101

0

する必要がありますが、@GordonLinoffは適切にあなたが実際に探しているように見える工夫してあなたが行で複数の特別な値を持っている場合は、「このソリューションが動作しません場合は'098000', '999998'ではない、最も近い前のpaydateからrc

DECLARE @Table AS TABLE (enc INT, rc CHAR(6), paydate DATE) 
INSERT INTO @Table (enc, rc, paydate) 
VALUES (123,'098000','20151221') 
,(123,'200000','20151214') 
,(456,'098000','20151221') 
,(456,'200000','20151221') 

SELECT 
    * 
    ,LagResult = LAG(rc,1,0) OVER (ORDER BY paydate) 
    ,rcnew = CASE 
     WHEN rc IN ('098000','999998') THEN LAG(rc,1,0) OVER (ORDER BY paydate) 
     ELSE rc 
    END 
FROM 
    @Table 
ORDER BY 
    paydate