Table unpivot dans SQL Server

J'ai une table avec les colonnes suivantes:

SeqNo, Date, Code, Val1, Val2, Val3,.. Val20 

J'ai besoin d'get cette représentation (je suppose que je devrais unpivot partie de la table de Val1 à Val20):

 SeqNo, Date, Code, Val 

où toutes les colonnes Val1 ..Val20 vont à la colonne Val .

Et de plus j'ai besoin de changer les valeurs de la colonne Date :

  • Pour "Val1", la valeur de "Date" ne doit pas être modifiée.
  • Pour "Val2", la valeur "Date" doit être diminuée d'un jour.
  • Pour "Val3" diminuer de 2 jours, etc.

Vous pouvez faire le pivot manuellement avec une cross join et une instruction case . Votre version a une torsion à cause de la colonne de date:

 with nums as ( select 1 as n union all select n + 1 from nums where n < 20 ) select t.seqno, dateadd(day, 1 - nums.n, t.date), t.code, (case when nums.n = 1 then val1 when nums.n = 2 then val2 . . . when nums.n = 20 then val20 end) as val from table t cross join nums;