动态行列转换:
1、一行对应多列需要转换,应该怎么解决?
2、动态行列转换时,动态列名能不能变动?
表1,table1:ID NO order content1  content2 content3 content4
1  1   a     s1         s2         a3      a4
2  2   a     df          df2        df3    dw4
3  3   a     g2         g3          gg      gh
4  1   b      a         a            r2     r3
5  2   b      d3        d            d      d
..............想把table1转换成如下格式:
order   content11   content12   content13    content21   content22  content23  content31   content32.....
a         s1             df        g2           s2           df2       g3         a3          df3
b       .....这个问题困饶我好几天了,没有做出来,网上也没有找到这样的事例,请各位朋友帮忙解决

解决方案 »

  1.   

    你是要用javascript实现还是如何?javascript应该好弄,把每行的数据读到数组里面,然后重新组合表格
      

  2.   


    create table tb(ID int,[NO] int, [order] varchar(10), content1 varchar(10), content2 varchar(10),content3 varchar(10),content4 varchar(10))
    insert into tb select
    1,1,'a','s1','s2 ','a3 ','a4 ' union all select
    2,2,'a','df','df2','df3','dw4' union all select
    3,3,'a','g2','g3 ','gg ','gh ' union all select
    4,1,'b','a ','a  ','r2 ','r3 ' union all select
    5,2,'b','d3','d  ','d  ','d  ' declare @s nvarchar(4000)
    set @s=''
    Select  @s=@s+','+'[content1'+cast([NO ]as varchar(10))+']=max(case when [NO]='+quotename([NO],'''')+' then content1 else null end),'
    +'[content2'+cast([NO ]as varchar(10))+']=max(case when [NO]='+quotename([NO],'''')+' then content2 else null end),'
    +'[content3'+cast([NO ]as varchar(10))+']=max(case when [NO]='+quotename([NO],'''')+' then content3 else null end),'
    +'[content4'+cast([NO ]as varchar(10))+']=max(case when [NO]='+quotename([NO],'''')+' then content4 else null end)'
    from tb group by [NO]
    exec('select [order] '+@s+' from tb group by [Order]')/*
    order      content11  content21  content31  content41  content12  content22  content32  content42  content13  content23  content33  content43  
    ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- 
    a          s1         s2         a3         a4         df         df2        df3        dw4        g2         g3         gg         gh 
    b          a          a          r2         r3         d3         d          d          d          NULL       NULL       NULL       NULL警告: 聚合或其它 SET 操作消除了空值。*/drop table tb
      

  3.   

    按照4楼中所说的操作,的确可以实现我的要求,可问题是
    我更换语句中的表名和字段后,现运行就出现错误如下:
    [color=#FF0000]消息 4145,级别 15,状态 1,第 1 行
    在应使用条件的上下文(在 'N from ODURdata group by [sn' 附近)中指定了非布尔类型的表达式。
    [/color]不知是什么问题???
      

  4.   

    上面这个情况不知是什么引起的,但肯定与数据表或内容有关系,
    还有一个问题,如上表,在没有转换之前,表里面有相同NO的行,但转换时,如有相同的NO的行,只转换ID值最大的那个(相同NO的最后一个)
    如何实现操作,应在4楼程序中加入什么语句,能实现我的要求??
      

  5.   

    ID NO job sn Lstate low Mstate mid Hstate high date
    50 8 O2009050010 12 Fail 1 1 2009-5-25
    51 1 O2009050010 12 Pass 0 2009-5-25
    52 2 O2009050010 12 Pass 1 2009-5-25
    53 3 O2009050010 12 Fail -77 1 2009-5-25
    54 7 O2009050010 12 Fail 0 1 2009-5-25
    55 8 O2009050010 12 Pass 10 -9 2009-5-25
    56 1 O2009050010 12 Fail 3 Pass 1 2009-5-25
    57 2 O2009050010 12 Pass 1 Fail 4 2009-5-25
    61 1 O2009050010 12 Pass 1      2009-5-25
    62 2 O2009050010 12      Pass 2 2009-5-25
    63 3 O2009050010 12 Fail 1      2009-5-25
    64 7 O2009050010 12 Fail 2      2009-5-25
    65 8 O2009050010 12 Fail 1      2009-5-25
    58 3 O2009050010 12 Pass -77 Fail 14 2009-5-25
    59 7 O2009050010 12 Fail 01 Fail 1 2009-5-25
    60 8 O2009050010 12 Fail 1 Fail 2 2009-5-25
    66 9 O2009050010 12 Fail 1      2009-5-25
    67 10 O2009050010 12 Fail 12      2009-5-25
    68 11 O2009050010 12 Fail 12           2009-5-25
    69 12 O2009050010 12 Fail 12      2009-5-25
    70 16 O2009050010 12 Fail 12      2009-5-25
    71 17 O2009050010 12 Pass 1      2009-5-25
    72 18 O2009050010 12 Pass 1      2009-5-25
    73 19 O2009050010 12 Fail 12      2009-5-25
    74 20 O2009050010 12 Pass 2      2009-5-25
    75 21 O2009050010 12 Pass 2      2009-5-25
    76 22 O2009050010 12 Pass 4      2009-5-25
    77 23 O2009050010 12 Pass 4      2009-5-25
    78 24 O2009050010 12 Fail 1      2009-5-25
    79 4 O2009050010 12 Pass -60      2009-5-25
    80 5 O2009050010 12 Fail 3      2009-5-25
    81 6 O2009050010 12 Fail 34      2009-5-25
    82 13 O2009050010 12 Pass 19 Fail 34 Fail 13 2009-5-25
    83 14 O2009050010 12 Fail 4 Fail 3 Fail 4 2009-5-25
    84 15 O2009050010 12 Fail 4 Fail 14 2009-5-25
    85 25 O2009050010 BLB07090077 Pass 3      2009-5-25
    103 25 O2009050014 BLB07090088 Pass 1      2009-6-2
    104 25 O2009050014 BLB07090088 Pass 1      2009-6-2
    105 9 O2009050014 BLB07090088 Fail 1      2009-6-2
    106 10 O2009050014 BLB07090088 Fail 1      2009-6-2
    107 11 O2009050014 BLB07090088 Fail 1           2009-6-2
    108 12 O2009050014 BLB07090088 Fail 1      2009-6-2
    152 25 O2009050014 BLB07090088 Pass 3      2009-6-2
    153 9 O2009050014 BLB07090088 Fail 1      2009-6-2
    154 10 O2009050014 BLB07090088 Fail 2      2009-6-2
    155 11 O2009050014 BLB07090088 Fail 2           2009-6-2
    156 12 O2009050014 BLB07090088 Fail 21      2009-6-2
    157 16 O2009050014 BLB07090088 Pass 2      2009-6-2
    158 17 O2009050014 BLB07090088 Pass 2      2009-6-2
    159 18 O2009050014 BLB07090088 Pass 2      2009-6-2
    160 19 O2009050014 BLB07090088 Pass 2      2009-6-2
    161 20 O2009050014 BLB07090088 Pass 2      2009-6-2
    162 21 O2009050014 BLB07090088 Pass 2      2009-6-2
    163 22 O2009050014 BLB07090088 Pass 2      2009-6-2
    164 23 O2009050014 BLB07090088 Pass 2      2009-6-2
    165 24 O2009050014 BLB07090088 Fail 2      2009-6-2
    166 4 O2009050014 BLB07090088 Fail 1      2009-6-2
    167 5 O2009050014 BLB07090088 Fail 1      2009-6-2
    168 6 O2009050014 BLB07090088 Fail 1      2009-6-2
    169 13 O2009050014 BLB07090088 Fail 1 Fail 1 Fail 1 2009-6-2
    170 14 O2009050014 BLB07090088 Fail 1 Fail 1 Fail 1 2009-6-2
    171 15 O2009050014 BLB07090088 Pass 1 Pass 1 Pass 1 2009-6-2
      

  6.   

    各位高手,帮忙解决这个问题,急!!jiangshun这位大哥帮我继续看一下
      

  7.   

    刚才复制的内容太多了,所以看得很乱:
    ID NO sn Lstate low Mstate mid Hstate high date
    1 1 12 1 1
    2 2 12 1 1
    3 3 12 1 1
    4 7 12 2 2
    5 8 12 2 2
    6 1 12 2 2
    7 2 12 2 2
    9 7 12 2 2
    10 8 12 2 2
    11 1 12 1 1
    12 2 12 2 2
    13 3 12 2 1
    14 7 12 12 12
    15 8 12 12 12
    16 1 13 1 1
    17 2 13 1 1
    18 3 13 1 1
    19 7 13 1 1
    20 8 13 1 1
      

  8.   


    create table tb(ID int,NO int,sn int,Lstate int,low int) 
    insert into tb select
    1 ,1,12,1 ,1  union all select              
    2 ,2,12,1 ,1  union all select              
    3 ,3,12,1 ,1  union all select              
    4 ,7,12,2 ,2  union all select              
    5 ,8,12,2 ,2  union all select              
    6 ,1,12,2 ,2  union all select              
    7 ,2,12,2 ,2  union all select              
    9 ,7,12,2 ,2  union all select              
    10,8,12,2 ,2  union all select             
    11,1,12,1 ,1  union all select             
    12,2,12,2 ,2  union all select             
    13,3,12,2 ,1  union all select             
    14,7,12,12,12 union all select            
    15,8,12,12,12 union all select            
    16,1,13,1 ,1  union all select           
    17,2,13,1 ,1  union all select           
    18,3,13,1 ,1  union all select           
    19,7,13,1 ,1  union all select           
    20,8,13,1 ,1  declare @s nvarchar(4000)
    set @s=''
    Select  @s=@s+','
    +'[sn'+cast([NO]as varchar(10))+']=max(case when [NO]='+quotename([NO],'''')+' then sn else null end),'
    +'[Lstate'+cast([NO]as varchar(10))+']=max(case when [NO]='+quotename([NO],'''')+' then Lstate else null end),'
    +'[low'+cast([NO]as varchar(10))+']=max(case when [NO]='+quotename([NO],'''')+' then [low] else null end)'
    from tb group by [NO]
    exec('select [NO] '+@s+' from tb group by [NO]')/*
    NO          sn1         Lstate1     low1        sn2         Lstate2     low2        sn3         Lstate3     low3        sn7         Lstate7     low7        sn8         Lstate8     low8        
    ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- 
    1           13          2           2           NULL        NULL        NULL        NULL        NULL        NULL        NULL        NULL        NULL        NULL        NULL        NULL
    2           NULL        NULL        NULL        13          2           2           NULL        NULL        NULL        NULL        NULL        NULL        NULL        NULL        NULL
    3           NULL        NULL        NULL        NULL        NULL        NULL        13          2           1           NULL        NULL        NULL        NULL        NULL        NULL
    7           NULL        NULL        NULL        NULL        NULL        NULL        NULL        NULL        NULL        13          12          12          NULL        NULL        NULL
    8           NULL        NULL        NULL        NULL        NULL        NULL        NULL        NULL        NULL        NULL        NULL        NULL        13          12          12
    */drop table tb
      

  9.   

    解决方法终于出来了,现把方法贴出来,如下:
    declare @s nvarchar(4000)
    set @s=''
    Select  @s=@s+','
    +'[sn'+cast([NO]as varchar(10))+']=max(case when [NO]='+quotename([NO],'''')+' then sn else null end),'
    +'[Lstate'+cast([NO]as varchar(10))+']=max(case when [NO]='+quotename([NO],'''')+' then Lstate else null end),'
    +'[low'+cast([NO]as varchar(10))+']=max(case when [NO]='+quotename([NO],'''')+' then [low] else null end)'
    from (select   *   from  tb   where   id   in    (select   max(id)   from   odurdata  group   by   sn,NO) ) as data group by [NO]
    exec('select [sn] '+@s+' from (select   *   from  tb   where   id   in    (select   max(id)   from   odurdata  group   by   sn,NO) ) as data group by [sn]')在此感谢各位网友对我问题的回答和帮助,我要特别感谢jiangshun 这位网友,是他帮我解决了这个问题。
    不过我也要对jiangshun说声对不起,因为我没有可用‘分’给你。实在很抱歉。