两张table table1
    SN   WORKORDER
    123  C001
    234  B001
每个SN 在TABLE2里对应3条纪录
table2
    SN     parameter
    123       100
    123       50
    123       60
    234       50
    234       80
    234       70要查询出如下结果
  sn      parameter1     parameter2     parameter3    workorder
  123     100                 50         60            c001
   234    50                  80         70            b001请问除了用leftjoin 死写,有没有什么简单点的写法

解决方案 »

  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.   

    SQL语句之合并行列转换 
     
      有表rowtocol,其数据如下:
      a b
      1 1
      1 2
      1 3
      2 1
      2 2
      3 1
      如何转换成如下结果:
      a b
      1 1,2,3
      2 1,2
      3 1   创建一个合并的函数      create function f_rowtocol(@a int)
      returns varchar(8000)
      as
      begin
       declare @str varchar(8000)
       set @str = ''
       select @str = @str + ',' + cast(b as varchar) from rowtocol where a = @a 
       set @str = right(@str , len(@str) - 1)
       return(@str)
      End
      go
      调用自定义函数得到结果:
      select distinct a ,dbo.f_rowtocol(a) from rowtocol 
     
      

  3.   

    行列转换加合计 
     
    例如有表A某些人每月消费数据如下:
    id data month
    001 11 1
    001 12 2
    001 13 3
    001 14 4
    001 15 5
    001 16 6
    001 17 7
    001 18 8
    001 19 9
    001 110 10
    001 111 11
    001 112 12
    002 21 1
    002 22 2
    002 23 3
    002 24 4
    002 25 5
    002 26 6
    002 27 7
    002 28 8
    002 29 9
    002 210 10
    002 211 11
    002 212 12
    要实现如下结果:   
     
    第一个: SELECT id as '人员' , 
    SUM(CASE month WHEN 1 THEN data ELSE 0 END) AS '1月' ,
    SUM(CASE month WHEN 2 THEN data ELSE 0 END) AS '2月' ,
    SUM(CASE month WHEN 3 THEN data ELSE 0 END) AS '3月' ,
    SUM(CASE month WHEN 4 THEN data ELSE 0 END) AS '4月' ,
    SUM(CASE month WHEN 5 THEN data ELSE 0 END) AS '5月' ,
    SUM(CASE month WHEN 6 THEN data ELSE 0 END) AS '6月' ,
    SUM(CASE month WHEN 7 THEN data ELSE 0 END) AS '7月' ,
    SUM(CASE month WHEN 8 THEN data ELSE 0 END) AS '8月' ,
    SUM(CASE month WHEN 9 THEN data ELSE 0 END) AS '9月' ,
    SUM(CASE month WHEN 10 THEN data ELSE 0 END) AS '10月' ,
    SUM(CASE month WHEN 11 THEN data ELSE 0 END) AS '11月' ,
    SUM(CASE month WHEN 12 THEN data ELSE 0 END) AS '12月' 
    FROM a
    GROUP BY ID 
     
    第二个: SELECT id as '人员' , 
    SUM(CASE month WHEN 1 THEN data ELSE 0 END) AS '1月' ,
    SUM(CASE month WHEN 2 THEN data ELSE 0 END) AS '2月' ,
    SUM(CASE month WHEN 3 THEN data ELSE 0 END) AS '3月' ,
    SUM(CASE month WHEN 4 THEN data ELSE 0 END) AS '4月' ,
    SUM(CASE month WHEN 5 THEN data ELSE 0 END) AS '5月' ,
    SUM(CASE month WHEN 6 THEN data ELSE 0 END) AS '6月' ,
    SUM(CASE month WHEN 7 THEN data ELSE 0 END) AS '7月' ,
    SUM(CASE month WHEN 8 THEN data ELSE 0 END) AS '8月' ,
    SUM(CASE month WHEN 9 THEN data ELSE 0 END) AS '9月' ,
    SUM(CASE month WHEN 10 THEN data ELSE 0 END) AS '10月' ,
    SUM(CASE month WHEN 11 THEN data ELSE 0 END) AS '11月' ,
    SUM(CASE month WHEN 12 THEN data ELSE 0 END) AS '12月' ,
    SUM(data) as '合计'
    FROM a
    GROUP BY ID 
     
      

  4.   

    /*引用*/1.包含两个表------典型行列转换问题例子 
    --建立测试环境
    create table tb1 (id nvarchar(10),type nvarchar(10))
    insert into tb1 select '11','a' union all select '22','b' union all select '33','c'
    create table tb2 (n int,type nvarchar(10),num int)
    insert into tb2 select '1','11','4' union all select '1','11','5' 
    union all select '2','22','8' union all select '3','22','5'
    --查询处理
    DECLARE @SQL VARCHAR(8000)
    SET @SQL='select n '
    SELECT @SQL= @SQL+',sum(case when type='+ttt+' then num else 0 end)['+tt+']' from
    (select distinct a.type as tt,isnull(b.type,'0') as ttt from tb2 b right join tb1 a on a.id=b.type) b
    set @sql=@sql+' from tb2 group by n'
    print @sql
    exec(@sql)
    go--删除测试环境
    Drop Table tb1,tb2这个我想会给楼主有帮助