2017-10-19 29 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现在试一试 –

相关问题