有关数据排列的棘手有关问题

有关数据排列的棘手问题
有关数据排列的棘手有关问题

数据如上:
由于数据太多,数据直接贴上都是乱排序的,所以只能上图。
黄色字段为ID,白色字段分别是A,B,C,D,E,F,G,H.
所需要的结果:
ID1是2100 后面ID2是2107,后面ID3是2164,后面ID4是2109,明显ID3的2164位置不对,应该在ID3的2164和其后面数据7上面加两个空格,让ID3和2164移到下一行。也就是最终结果ID由左到右大小依次排序,前一个ID比后一个ID大的,前一个ID和其数据上面加空格,让他对齐到下一行,下一行再比较。
有关数据排列的棘手有关问题
不知道我这样描述大侠能否看明白。拜托各位大虾了。

我给些数据用
6020 25.3 6195 24.3 6196 7 6253 4 6030 0.3 6039 25 6042 0.1 6044 8
6132 41.11 6251 24.3 6252 7 6309 4 6142 0.5 6151 42 6154 0.4 6156 32
6188 24.3 6307 12.8 6308 3 6365 8 6254 0.3 6207 24 6210 0.2 6212 16
6244 24.3 6363 25.4 6420 59 6421 67 6310 0.2 6263 24 6266 0.2 6268 16
6300 12.8 6419 208.7 6476 81 6477 96 6422 2.7 6319 13 6322 0.1 6324 8
6356 25.4 6475 300.6 6532 7 6533 4 6478 3.9 6375 25 6378 0.2 6380 16
6412 208.7 6531 24.3 6588 3 6589 4 6534 0.3 6431 209 6434 0.2 6436 72
6468 300.6 6587 12.3 6644 4 6645 13 6590 0.2 6487 300 6490 0.4 6492 100
6524 24.3 6811 16.5 6812 4 6813 3 6646 0.5 6543 24 6546 0.2 6548 16
6580 12.3 6867 50.3 6924 7 6869 8 6814 0.2 6599 12 6602 0.1 6604 8
6636 41.11 6923 25.3 6980 24 6925 8 6870 0.7 6655 42 6658 0.4 6660 32
6804 16.5 6979 84.3 7036 7 6981 27 6926 0.3 6823 16 6826 0.3 6885 32

------解决思路----------------------
这种业务逻辑光依靠SQL语句来实现是不现实的,需要把表的数据转成数组或者其他集合通过程序代码来遍历处理,才能得到你想要的结果
------解决思路----------------------
WITH table1(id,value) AS (-- 原始数据不要分多列
    SELECT 6020,25.3 UNION ALL
    SELECT 6195,24.3 UNION ALL
    SELECT 6196,7 UNION ALL
    SELECT 6253,4 UNION ALL
    SELECT 6030,0.3 UNION ALL
    SELECT 6039,25 UNION ALL
    SELECT 6042,0.1 UNION ALL
    SELECT 6044,8 UNION ALL
    SELECT 6132,41.11 UNION ALL
    SELECT 6251,24.3 UNION ALL
    SELECT 6252,7 UNION ALL
    SELECT 6309,4 UNION ALL
    SELECT 6142,0.5 UNION ALL
    SELECT 6151,42 UNION ALL
    SELECT 6154,0.4 UNION ALL
    SELECT 6156,32
)
,t1 AS (-- 排序
    SELECT *,
           ROW_NUMBER() OVER(ORDER BY id)-1 i
      FROM table1
)
,t2 AS (-- 计算行列
    SELECT *,
           (i / 8)+1 row,
           (i % 8)+1 col
      FROM t1
)
,t3 AS (-- id 行列转换
    SELECT *
      FROM (SELECT row,
                   'id'+Convert(varchar(11),col) colname,
                   id
              FROM t2
           ) t
     PIVOT (
            MAX(id)
            FOR colname IN ([id1],[id2],[id3],[id4],
                            [id5],[id6],[id7],[id8])
           ) p
)
,t4 AS (-- value 行列转换
    SELECT *
      FROM (SELECT row,
                   'value'+Convert(varchar(11),col) colname,
                   value
              FROM t2
           ) t
     PIVOT (
            MAX(value)
            FOR colname IN ([value1],[value2],[value3],[value4],
                            [value5],[value6],[value7],[value8])
           ) p
)
SELECT id1,value1,
       id2,value2,
       id3,value3,
       id4,value4,
       id5,value5,
       id6,value6,
       id7,value7,
       id8,value8
  FROM t3
  JOIN t4 
    ON t3.row = t4.row
 ORDER BY t3.row

 
        id1 value1           id2 value2           id3 value3           id4 value4           id5 value5           id6 value6           id7 value7           id8 value8
----------- -------- ----------- -------- ----------- -------- ----------- -------- ----------- -------- ----------- -------- ----------- -------- ----------- --------
       6020    25.30        6030     0.30        6039    25.00        6042     0.10        6044     8.00        6132    41.11        6142     0.50        6151    42.00
       6154     0.40        6156    32.00        6195    24.30        6196     7.00        6251    24.30        6252     7.00        6253     4.00        6309     4.00