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 № 1Je 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;