行 ptd_no Qty Name dsc_rem
     1     10   货号 F100 
     1     10   客号 B100
     2     20   货号 C100
   2     20   客号 D100想达到的效果
  
      prd_no qty name dsc_rem   字段名随便 F1 F2 F2也行
第一行   订单号 数量 客号 货号  注前两个"订单号" "数量" 名称可以固定 后面的就要字
第二行  1     10    B100  F100   段NAME 里取            
第三行    2     20    D100  C100  求那个大侠帮帮忙 急啊,

解决方案 »

  1.   

    SQL语句之普通行列转换 
     
    假设有张学生成绩表(tb_rowtocol)如下
    Name Subject Result
    张三 语文  73
    张三 数学  83
    张三 物理  93
    李四 语文  74
    李四 数学  84
    李四 物理  94想变成 
    姓名 语文 数学 物理
    张三 73  83  93
    李四 74  84  94declare @sql varchar(4000)
    set @sql = 'select Name as ' + '姓名'
    select @sql = @sql + ' , sum(case Subject when '''+Subject+''' then Result end) ['+Subject+']'
    from (select distinct Subject from rowtocol) as a
    set @sql = @sql + ' from rowtocol group by name'
    exec(@sql) 
     
    如果上述两表互相换一下:即
    表名(cj)
    姓名 语文 数学 物理
    张三 73  83  93
    李四 74  84  94想变成 Name Subject Result
    张三 语文  73
    张三 数学  83
    张三 物理  93
    李四 语文  74
    李四 数学  84
    李四 物理  94select 姓名 as Name,'语文' as Subject,语文 as Result from CJ union
    select 姓名 as Name,'数学' as Subject,数学 as Result from CJ union
    select 姓名 as Name,'物理' as Subject,物理 as Result from CJ
    order by 姓名 desc
      

  2.   

    dawugui 你说的是不错啊,
    可是我的意思是  字段名,什么名称都可以
           只是第一行,写入的数据是 字段名,
      例    字段名 prd_no qty name dsc_rem 
         第一行   订单号 数量 客号 货号
        到第二行才是你说的开始行转列的数据 这个能做到吗?谢谢了
      

  3.   

    将dawugui说的查询出来 然后放到一个临时表里面用select '订单号','数量','客号','货号' union all
      select 'prd_no','qty','name','dsc_rem' from 临时表再将整个记录 insert 到表里面就好.
      

  4.   

    if object_id('test') is not null drop table test
    select 1 as ptd_no, 10 as Qty, '货号' as [Name], 'F100' as dsc_rem
    into test
    union select 1, 10, '客号', 'B100'
    union select 2, 20, '货号', 'C100'
    union select 2, 20, '客号', 'D100'
    --------------------------------------------
    declare @s varchar(800)
    set @s = 'select * from (select ''订单号'' as ptd_no, ''数量'' as Qty'
    select @s = @s + ', ''' + a.[Name] + ''' as ' + a.[Name]
    from (select distinct [name] from test) a
    set @s = @s + ' union select cast(ptd_no as varchar),  cast(Qty as varchar)'
    select @s = @s + ', min(case [name] when ''' + a.[Name] 
        + ''' then dsc_rem end)'
    from (select distinct [name] from test) a
    set @s = @s + ' from test group by ptd_no, Qty) a '
        + 'order by case isnumeric(ptd_no) when 1 then ptd_no else 0 end'
    exec(@s)
    /*
    ptd_no                         Qty                            货号   客号   
    ------------------------------ ------------------------------ ---- ---- 
    订单号                         数量                            货号   客号
    1                              10                             F100 B100
    2                              20                             C100 D100*/
    --------------------------------------------
    drop table test
      

  5.   

    dulei115 我照着你的修改了一下,是不是@S 800 的字符太小啊,字符串到一半就断了
    后来我修改到8000还是不行,
         不知道是不是因为设置的@S 不够长啊,
      

  6.   

    谢谢dulei115(前途无亮) 提供代码 dawugui (5)、