/ / Décompressez une table mais ajoutez une colonne d'index pour numéroter chaque élément de la nouvelle colonne en fonction de son groupe - sql, sql-server

Décomposer une table mais ajouter une colonne d'index pour numéroter chaque élément de la nouvelle colonne en fonction de son groupe - sql, sql-server

J'ai une table comme ça

+--+------+------+------+------+------+
|ID|Value1|Value2|Value3|Value4|Value5|
+--+------+------+------+------+------+
|1 |100   |105   |110   |134   |102   |
|2 |96    |45    |103   |100   |105   |
|3 |40    |85    |194   |134   |135   |
+--+------+------+------+------+------+

que je peux unpivot semblable à celui-ci

SELECT
ID,
Value
FROM
(
SELECT
ID,
Value1,
Value2,
Value3,
Value4,
Value5
FROM
Tbl
) as src
UNPIVOT
(
Value for Values in (Value5, Value4, Value3, Value2, Value1)
) as up

et obtenir un résultat qui ressemble à ceci

+--+-----+
|ID|Value|
+--+-----+
|1 |102  |
|1 |134  |
|1 |110  |
|1 |105  |
|1 |100  |
|2 |105  |
|2 |100  |
|2 |103  |
|2 |45   |
|2 |96   |
|3 |135  |
|3 |134  |
|3 |194  |
|3 |85   |
|3 |40   |
+--+-----+

Comment puis-je ajouter une colonne supplémentaire àle résultat qui numérote chaque élément de l’unpivot. Je dois transformer nos données dans ce format pour un extrait, et l'indexation est utilisée pour définir d'autres valeurs. Le non-pivot est nouveau pour moi, j’imagine que cela doit être fait dans ce bloc, car c’est là que l’ordre existe - j’ai explicitement indiqué de ne pas pivoter dans l’ordre inverse des colonnes. utiliser un ORDER BY.

+--+-----+-----+
|ID|Value|Index|
+--+-----+-----+
|1 |102  |5    |
|1 |134  |4    |
|1 |110  |3    |
|1 |105  |2    |
|1 |100  |1    |
|2 |105  |5    |
|2 |100  |4    |
|2 |103  |3    |
|2 |45   |2    |
|2 |96   |1    |
|3 |135  |5    |
|3 |134  |4    |
|3 |194  |3    |
|3 |85   |2    |
|3 |40   |1    |
+--+-----+-----+

Réponses:

2 pour la réponse № 1

Je l'ai compris via section 3 sur les valeurs et en utilisant un CROSS APPLY

SELECT
t.*
FROM
tbl
CROSS APPLY (
VALUES
(ID, Value5, "5"),
(ID, Value4, "4"),
(ID, Value3, "3"),
(ID, Value2, "2"),
(ID, Value1, "1")
) t(ID, Value, Index)

0 pour la réponse № 2

Je ne suis pas sûr de la façon dont le moteur déterminera l’ordre dans lequel attribuer le numéro de ligne. Je suppose que c’est l’ordre des valeurs définies dans l’unpivot ...

DEMO: http://rextester.com/WTKLDR72234

SELECT ID
, val
, 6-row_number() over (partition by ID order by (Select null)) as Idx
FROM (SELECT ID
, Value1
, Value2
, Value3
, Value4
, Value5
FROM Tbl) as src
UNPIVOT
(
val for vals in (Value5, Value4, Value3, Value2, Value1)
) as up;