数据如下:序号 金额
1    100
2    120
3    130 
4    200 
5     200
6    500
.     .
.     .
由于数据量很大,但是列只有“序号”和“金额”2列。
能否通过SQL 语句把数据转换成如下格式,能保证在一张纸多打印一些信息。
序号 金额   序号  金额  序号 金额
1    100   3    130  5    200
2    120   4    200  6    500

解决方案 »

  1.   

    试试这样变通一下,我以前也遇上过这样的问题.
    一,先建立一个临时表,结构就是xh1,je1,xh2,je2,xh3,je3
    二,遍历所有的记录,然后将记录按次序以行的方式加入到这个临时表中去.
      

  2.   

    一条SQL是做不了的,变通一下设计或者写个procedure,
      

  3.   


    --just do it
    select a.id,a.name,b.id,b.name,c.id,c.name
    from 
    (
    (select rownum rn,id,name from (SELECT row_number() OVER(PARTITION BY trunc((id-1)/3) order by mod(id-1,3)) as rn,AA.* from AA) where rn=1) A 
    left JOIN 
    (select rownum rn,id,name from (SELECT ROW_NUMBER() OVER(PARTITION BY trunc((id-1)/3) order by mod(id-1,3)) as rn,AA.* from AA) where rn=2) B 
    ON A.RN=B.RN
    left JOIN 
    (select rownum rn,id,name from (SELECT ROW_NUMBER() OVER(PARTITION BY trunc((id-1)/3) order by mod(id-1,3)) as rn,AA.* from AA) where rn=3) C
    ON A.RN=C.RN)
      

  4.   

    1 348
    2 416
    3 740
    4 989
    5 1267
    6 1275
    7 1316
    8 1503
    9 2025
    10 2110
    11 2191
    12 2200
    13 2377
    14 2505
    15 2545
    16 2553
    17 2640
    18 2729
    19 2808
    20 2817
    21 3485
    22 5704
    23 6083
    24 6729
    25 6808
    26 7134
    27 7286
    28 7299
    29 7312
    30 7392
    31 8243
    32 8499
    33 8506
    34 8815
    35 9070
    36 9078
    37 9088
    38 9096
    39 9181
    40 9199
    41 9207
    42 9308
    43 9318
    44 11821
    45 11825
    46 11839
    47 13797
    48 14151
    49 15085
    50 15305
    51 15407
    52 15421
    53 15430
    54 15582
    55 16542
    56 16820
    57 18137
    58 18147
    59 18339
    60 18347
    61 18517
    62 18782
    63 19162
    64 19334
    65 19400
    66 19414
    67 19427
    68 20040
    69 20883
    70 20892
    71 20904
    72 21372
    73 21378
    74 21455
    75 21756
    76 21766
    77 22135
    78 23145
    79 24111
    80 24124
    81 24128
    82 24130
    83 24148
    84 24316
    85 24602
    86 24626
    87 25076
    88 25454
    89 26247
    90 26257sql:
    select sum(tt.n1) num,sum(tt.v1) money,sum(tt.n2) num,sum(tt.v2) money,sum(tt.n3) num,sum(tt.v3) money,
           sum(tt.n4) num,sum(tt.v4) money,sum(tt.n5) num,sum(tt.v5) money,sum(tt.n6) num,sum(tt.v6) money,
           sum(tt.n7) num,sum(tt.v7) money,sum(tt.n8) num,sum(tt.v8) money,sum(tt.n9) num,sum(tt.v9) money,
           sum(tt.n10) num,sum(tt.v10) money,sum(tt.n11) num,sum(tt.v11) money,sum(tt.n12) num,sum(tt.v12) money,
           sum(tt.n13) num,sum(tt.v13) money
    from 
    (
      select floor(t.n/13) n,decode(flag,2,t.n,0) n1,decode(flag,2,t.m,0) v1,decode(flag,3,t.n,0) n2,decode(flag,3,t.m,0) v2,
           decode(flag,4,t.n,0) n3,decode(flag,4,t.m,0) v3,decode(flag,5,t.n,0) n4,decode(flag,5,t.m,0) v4,
           decode(flag,6,t.n,0) n5,decode(flag,6,t.m,0) v5,decode(flag,7,t.n,0) n6,decode(flag,7,t.m,0) v6,
           decode(flag,8,t.n,0) n7,decode(flag,8,t.m,0) v7,decode(flag,9,t.n,0) n8,decode(flag,9,t.m,0) v8,
           decode(flag,10,t.n,0) n9,decode(flag,10,t.m,0) v9,decode(flag,11,t.n,0) n10,decode(flag,11,t.m,0) v10,
           decode(flag,12,t.n,0) n11,decode(flag,12,t.m,0) v11,decode(flag,13,t.n,0) n12,decode(flag,13,t.m,0) v12,
           decode(flag,1,t.n,0) n13,decode(flag,1,t.m,0) v13
    from 
    (
      select aa.n,aa.m,mod(aa.n,13)+1 flag
      from aa
    )t
    )
    tt
    group by tt.n结果:    NUM MONEY NUM MONEY NUM MONEY NUM MONEY NUM MONEY NUM MONEY NUM MONEY NUM MONEY NUM MONEY NUM MONEY NUM MONEY NUM MONEY NUM MONEY
    1 1 348 2 416 3 740 4 989 5 1267 6 1275 7 1316 8 1503 9 2025 10 2110 11 2191 12 2200 0 0
    2 14 2505 15 2545 16 2553 17 2640 18 2729 19 2808 20 2817 21 3485 22 5704 23 6083 24 6729 25 6808 13 2377
    3 27 7286 28 7299 29 7312 30 7392 31 8243 32 8499 33 8506 34 8815 35 9070 36 9078 37 9088 38 9096 26 7134
    4 40 9199 41 9207 42 9308 43 9318 44 11821 45 11825 46 11839 47 13797 48 14151 49 15085 50 15305 51 15407 39 9181
    5 53 15430 54 15582 55 16542 56 16820 57 18137 58 18147 59 18339 60 18347 61 18517 62 18782 63 19162 64 19334 52 15421
    6 66 19414 67 19427 68 20040 69 20883 70 20892 71 20904 72 21372 73 21378 74 21455 75 21756 76 21766 77 22135 65 19400
    7 79 24111 80 24124 81 24128 82 24130 83 24148 84 24316 85 24602 86 24626 87 25076 88 25454 89 26247 90 26257 78 23145
      

  5.   

    每行取rownum,再order by rownum,再sum+decode
      

  6.   

    TO sleepzzzzz :
    此语句最终的结果是按照序号横向排列的,如何能调整成纵向啊。
    原始数据状态:
    ID NAME
    1 2
    2 3
    3 4
    4 5
    5 6
    6 7
    7 8
    8 9
    语句执行后,变为了
    ID NAME ID NAME ID NAME
    1 2 2 3 3 4
    4 5 5 6 6 7
    7 8 8 9
    我想得到的效果是:
    ID NAME ID NAME ID NAME
    1        2      4        5      7         8
    2        3      5        6      8         9
    3        4      6        7由于对上述脚本的函数不熟,再请教一下。谢谢。
      

  7.   

    上面例子不太清楚,改了一下例子。
    TO sleepzzzzz : 
    此语句最终的结果是按照序号横向排列的,如何能调整成纵向啊。 
    原始数据状态: 
    ID NAME 
    1 张1 
    2 张2 
    3 张3
    4 张4 
    5 张5 
    6 张6 
    7 张7 
    8 张8 
    语句执行后,变为了 
    ID NAME   ID NAME  ID NAME 
    1 张1     2  张2   3  张3  
    4 张4     5  张5   6  张6
    7 张7     8  张8 
    我想得到的效果是: 
    ID    NAME   ID NAME     ID   NAME 
    1     张1    4   张4      7   张7 
    2     张2    5   张5      8   张8
    3     张3    6   张6           由于对上述脚本的函数不熟,再请教一下。谢谢。
      

  8.   

    学习了!呵呵
    表res_node数据:
    res_id     res_name
    9207 Res-BJBMC4083-SNMP1
    9308 Res-BJBMC4083-SNMP2
    221319 Res-BJCMPCJ1-SNMP3
    221331 Res-BJCMPCJ1-SNMP4
    223897 Res-BJCMPCJ1-SNMP5 
    223845 Res-BJCMPCJ1-SNMP6 
    224236 Res-BJCMPCJ1-SNMP7 
    224487 Res-BJCMPCJ1-SNMP8 
    241587 Res-BJCMPCJ1-SNMP9 查询语句:
     
    select a.id,a.name,b.id,b.name,c.id,c.name
    from 
    (select rownum rn,id,name 
    from 
     (
    select row_number() OVER(PARTITION BY trunc((rownum-1)/3) order by mod(rownum-1,3)) as rn,n.res_id id,res_name name 
           from res_node n
     ) 
    where rn=1
    ) a,(select rownum rn,id,name 
    from 
     (
           SELECT row_number() OVER(PARTITION BY trunc((rownum-1)/3) order by mod(rownum-1,3)) as rn,n.res_id id,res_name name 
           from res_node n
     ) 
    where rn=2)b,(select rownum rn,id,name 
    from 
     (
           SELECT row_number() OVER(PARTITION BY trunc((rownum-1)/3) order by mod(rownum-1,3)) as rn,n.res_id id,res_name name 
           from res_node n
     ) 
    where rn=3)c
    where a.rn = b.rn
          and b.rn = c.rn
    查询结果:  id             name             id           name                id         name            
    9207 Res-BJBMC4083-SNMP1 9308 Res-BJBMC4083-SNMP2 221319 Res-BJCMPCJ1-SNMP3
    221331 Res-BJCMPCJ1-SNMP4 223897 Res-BJCMPCJ1-SNMP5 223845 Res-BJCMPCJ1-SNMP6
    224236 Res-BJCMPCJ1-SNMP7 224487 Res-BJCMPCJ1-SNMP8 241587 Res-BJCMPCJ1-SNMP9