2017-10-19 30 views
0

我想旋轉以下數據,以便根據列rn中的值可以獲得前一列和當前列。如果只有一條記錄,那麼當前值和以前的值將是相同的值。 (我使用SSMS 2008)基於上述數據上一個值和當前值

CREATE TABLE #TEST1 
(ACCT_ID INT, RN INT, LoadDate Date) 

INSERT INtO #TEST1 VALUES (1, 1, '2016-12-21') 
INSERT INtO #TEST1 VALUES (2, 1, NULL) 
INSERT INtO #TEST1 VALUES (3, 1, '2017-10-06') 
INSERT INtO #TEST1 VALUES (3, 2, NULL) 
INSERT INtO #TEST1 VALUES (4, 1, '2016-12-21') 

SELECT * FROM #TEST1 
ACCT_ID RN LoadDate 
1 1 2016-12-21 
2 1 NULL 
3 1 2017-10-06 
3 2 NULL 
4 1 2016-12-21 

,我做樞軸表

SELECT ACCT_ID, [1] as Prev, [2] as Curr FROM 
(
    SELECT * fROM #TEST1 S 
    pivot( MAX(LoadDate) for RN IN ([1],[2])) U 
)X 

例如如何ACCT_ID 1和4具有在電流相同的值與先前值。

+2

顯示需要的結果。 –

回答

0

我不知道,如果將支點在這種情況下工作,我很抱歉,如果你特別是使用旋轉需要一個答案。

在這裏,我通過子查詢獲取MAX(RN),然後爲前一個和當前LoadDate執行select語句。當前日期是由MAX(RN)提供的日期。如果MAX(RN)大於1,則前一個日期是MAX(RN) - 1的日期,否則它是RN等於1的前一個日期。

SELECT dT.ACCT_ID 
     ,(SELECT T1.LoadDate FROM #TEST1 T1 WHERE T1.ACCT_ID = dT.ACCT_ID AND T1.RN = CASE WHEN dT.MaxRN = 1 THEN 1 ELSE dT.MaxRN - 1 END) [Prev] 
     ,(SELECT T1.LoadDate FROM #TEST1 T1 WHERE T1.ACCT_ID = dT.ACCT_ID AND T1.RN = dT.MaxRN) [Curr] 
    FROM (
     SELECT ACCT_ID 
       ,MAX(RN) [MaxRN] 
      FROM #TEST1 
      GROUP BY ACCT_ID 
) AS dT 
0

我會用有條件聚集:

select acct_id, 
     max(case when rn = 1 then loaddate end) as load_date, 
     max(case when rn = 2 then loaddate end) as load_date_prev 
from #test1 t 
group by acct_id; 
+0

這沒有奏效。 ID 1和4在load_date_prev中具有空值,而不是具有與load_date相同的值 – user3059409

1

我猜你需要這樣的事情。如果Prev爲空,它將顯示Curr值。

select acct_id, curr, case when prev = ' ' then null else coalesce(prev, curr) end 
from 
(
    SELECT acct_id, 
     max(CASE WHEN RN = 1 THEN loaddate END) as Curr, 
     max(CASE WHEN RN = 2 THEN coalesce(loaddate, ' ') END) as Prev 
    FROM #test1 t 
    GROUP BY acct_id 
) t 

demo

+0

這有效,但它影響ID 3.該記錄具有2行數據。第一個有一個值,第二個沒有,我希望它保持那樣... – user3059409

+0

@ user3059409是的,它有'null'值被取代...我會考慮它 –

+0

@ user3059409現在試一試 –

相關問題