Eu tenho uma mesa assim
+--+------+------+------+------+------+
|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 eu posso desviar semelhante a este
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
e obter um resultado que se parece com isso
+--+-----+
|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 |
+--+-----+
Como posso adicionar uma coluna adicional parao resultado que numera cada item no unpivot. Preciso transformar nossos dados nesse formato para uma extração, e a indexação é usada para definir outros valores. Desvirar é novo para mim, eu imagino que precisa ser feito nesse bloco de alguma forma, já que é onde a ordenação existe - eu declaro explicitamente para desmotivar na ordem inversa da coluna. Não há nenhuma ordem diferente entre o resto das colunas para use um 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 |
+--+-----+-----+
Respostas:
2 para resposta № 1Descobri isso via seção 3 sobre valores e usando um 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 para resposta № 2
Não tenho certeza sobre como o mecanismo determinará a ordem na qual atribuir o número da linha. Estou supondo que seja a ordem dos vals definidos no 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;