2017-10-19 10 views
0

Je souhaite faire pivoter les données suivantes de sorte que je puisse avoir une colonne précédente et une colonne actuelle en fonction des valeurs de la colonne rn. S'il n'y a qu'un seul enregistrement, les valeurs actuelles et précédentes auront la même valeur. (J'utilise SSMS 2008)Valeur précédente et valeur actuelle

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 

Sur la base des données ci-dessus, je l'ai fait un tableau croisé dynamique

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

Comment peut par exemple acct_id 1 et 4 ont la même valeur actuelle que le précédent valeur.

+2

Afficher les résultats que vous voulez. –

Répondre

0

Je ne suis pas sûr que pivot fonctionne dans ce cas, je présente mes excuses si vous avez besoin spécifiquement une réponse à l'aide pivot.

Ici, je prends la MAX (RN) via une sous-requête, puis je fais des instructions select pour le LoadDate précédent et en cours. La date actuelle est la date fournie par le MAX (RN). La date précédente est la date de MAX (RN) - 1 si MAX (RN) est supérieur à 1, sinon il est la date précédente où RN est égal à 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

J'utiliser l'agrégation conditionnelle:

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

Cela n'a pas fonctionné. ID 1 et 4 ont des valeurs nulles dans le load_date_prev au lieu d'avoir la même valeur que load_date – user3059409

1

Je suppose que vous avez besoin de quelque chose comme ça. Il affiche la valeur Curr si le Prev est vide.

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

Cela a fonctionné mais il a affecté l'ID 3. Cet enregistrement avait 2 lignes de données. Le 1er avait une valeur et le 2ème n'en avait pas et je voulais qu'il reste comme ça ... – user3059409

+0

@ user3059409 oui il a la valeur 'null' qui est remplacée ... je vais y penser –

+0

@ user3059409 l'essayer maintenant –