2016-06-16 11 views
0

Nicht sicher, wie ein Ergebnisdiagramm von dem, was ich will, zu zeigen, aber sehen Sie unten, was ich versuche zu tun. Ich versuche, die rcnew-Spalte zu erstellen, wo ein rc in "098000" oder "999998" ist, und ändere diese in rc vom nächsten vorherigen Zahltag, wo der rc nicht in '098000' oder '999998' ist. Wie Sie sehen können, hat mein Code, wo paydate gleich ist, das ist, weil ich nicht herausfinden kann, wie man das macht. Wenn es kein gleiches Zahldatum gibt, möchte ich das rpevious nehmen. Die NULL in der unten angegebenen Ergebnisse sollten 200000. seinSuche nach Daten

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 

Antwort

1

lag() wird nicht funktionieren, wenn Sie mehrere spezielle Werte in einer Zeile haben. eine Alternative ist outer apply:

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

Guter Fang in seinem Code, den ich glaube, dass Sie richtig sind, dass seine Frage wohl zu schreiben bedeutet „nächste vorherige paydate wo rc nicht‚098000‘oder‚999998‘ist“, aber er tat es nicht – Matt

+0

Ja, das ist was ich sagen wollte. Aber ich werde versuchen, äußerlich anzuwenden und zu dir zurück zu kommen. Vielen Dank! – ajc101

+0

Das funktionierte übrigens. Vielen Dank! – ajc101

0

Sie die LAG Funktion verwenden können, wenn Sie gemeint „rc vom nächsten vorherigen paydate“, sondern als @GordonLinoff in geeigneter Weise entwickelt es sieht aus wie Sie wirklich suchen die "rc vom nächsten vorherigen paydate, die nicht '098000', '999998' in diesem Fall ist diese Lösung nicht.

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