2012-07-02 3 views
2

Я получаю данные в 6 столбцах. Как я могу отсортировать эти столбцы в своих значениях и сохранить их в новом столбце или в том же столбце.Как сортировать 6 столбцов в числовой порядок

Input 
ID N1 N2 N3 N4 N5 N6 
1 6 4 5 3 1 2 
2 42 43 46 45 48 47 

Desired Output 
ID N1 N2 N3 N4 N5 N6 S1 S2 S3 S4 S5 S6 
1 6 4 5 3 1 2 1 2 3 4 5 6 
2 42 43 46 45 48 47 42 43 45 46 47 48 

ответ

1
select T.ID, T.N1, T.N2, T.N3, T.N4, T.N5, T.N6, 
     N.X.value('N[1]', 'int') as S1, 
     N.X.value('N[2]', 'int') as S2, 
     N.X.value('N[3]', 'int') as S3, 
     N.X.value('N[4]', 'int') as S4, 
     N.X.value('N[5]', 'int') as S5, 
     N.X.value('N[6]', 'int') as S6 
from YourTable as T 
cross apply 
    (
    select N 
    from (values (N1),(N2),(N3),(N4),(N5),(N6)) as N(N) 
    order by N.N 
    for xml path(''), type 
) as N(X) 

SE-Data

То же самое, но с использованием pivot вместо XML.

select P.ID, P.N1, P.N2, P.N3, P.N4, P.N5, P.N6, 
     P.[1] as S1, 
     P.[2] as S2, 
     P.[3] as S3, 
     P.[4] as S4, 
     P.[5] as S5, 
     P.[6] as S6 
from 
    (
    select T.ID, T.N1, T.N2, T.N3, T.N4, T.N5, T.N6, N.N, N.rn 
    from YourTable as T 
    cross apply 
     (
     select N, 
       row_number() over(order by N.N) as rn 
     from (values (N1),(N2),(N3),(N4),(N5),(N6)) as N(N) 
    ) N 
) as T 
pivot (min(T.N) for T.rn in ([1],[2],[3],[4],[5],[6])) as P 

SE-Data

+0

У меня болит голова, чтобы посмотреть на это, но он действительно работает. –

4

Try:

DECLARE @t TABLE (ID INT, N1 INT,N2 INT,N3 INT,N4 INT,N5 INT,N6 INT) 
INSERT @t VALUES 
(1, 6 ,4 ,5 ,3 ,1 ,2), 
(2, 42 ,43 ,46 ,45 ,48 ,47) 

DECLARE @t1 TABLE (ID INT, a INT, b VARCHAR(10), RowNum INT) 
DECLARE @t2 TABLE (ID INT, a INT, b VARCHAR(10)) 

INSERT @t1 
SELECT ID, a, b, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY a) RowNum 
FROM @t 
UNPIVOT 
(
    a FOR b IN ([N1],[N2],[N3],[N4],[N5],[N6]) 
) unpvt 
ORDER BY ID, a 

UPDATE @t1 
SET  b = 'S'+ CAST(RowNum AS VARCHAR(10)) 

INSERT INTO @t2 
SELECT a.ID, a.a, a.b 
FROM @t1 a 

SELECT a.ID, 
     a.N1,a.N2,a.N3,a.N4,a.N5,a.N6, 
     b.S1,b.S2,b.S3,b.S4,b.S5,b.S6 
FROM @t a 
JOIN (
    SELECT * 
    FROM @t2 
    PIVOT 
    (
     MAX(a) FOR b IN ([S1],[S2],[S3],[S4],[S5],[S6]) 
    ) pvt 
) b ON b.ID = a.ID 
+2

+1 Хороший и легкий –

+0

Спасибо :) Один UNPIVOT и один шарнирные и там это. –

+0

У меня болит голова, чтобы посмотреть на это, но он действительно работает. –

2

Там более чем один путь к коже кошки.

Метод, предложенный Иваном, является далеким предпочтительным способом сделать это, но если скорость не является проблемой, то после очень неустановленного на основе решения было бы и интересно смотреть.

В сущности, все это происходит при обмене столбцами друг с другом, пока все элементы не находятся в правильном положении.

DECLARE @Cnt INTEGER 
DECLARE @t TABLE (ID INT, N1 INT,N2 INT,N3 INT,N4 INT,N5 INT,N6 INT) 
INSERT @t VALUES 
(1, 6 ,4 ,5 ,3 ,1 ,2), 
(2, 42 ,43 ,46 ,45 ,48 ,47) 

SET @Cnt = 1 
WHILE @Cnt <> 0 
BEGIN 
    SET @Cnt = 0 

    UPDATE @t SET N1 = N2, N2 = N1, @Cnt = @Cnt + 1 WHERE N1 > N2 
    UPDATE @t SET N2 = N3, N3 = N2, @Cnt = @Cnt + 1 WHERE N2 > N3 
    UPDATE @t SET N3 = N4, N4 = N3, @Cnt = @Cnt + 1 WHERE N3 > N4 
    UPDATE @t SET N4 = N5, N5 = N4, @Cnt = @Cnt + 1 WHERE N4 > N5 
    UPDATE @t SET N5 = N6, N6 = N5, @Cnt = @Cnt + 1 WHERE N5 > N6 
    SELECT * FROM @t 

END 
+1

Это буквально применяется для сортировки по столбцам :) –

+0

Я использовал что-то вроде этого в качестве промежуточного решения. –

Смежные вопросы