select 字段1 , (case when 字段2='1001' then 字段3 else '' end ) as '1001',
(case when 字段2='1002' then 字段3 else '' end ) as '1002',
(case when 字段2='1003' then 字段3 else '' end ) as '1003',
(case when 字段2='1004' then 字段3 else '' end ) as '1004' from 表

解决方案 »

  1.   

    select 字段1 , (case when 字段2='1001' then 字段3 else '' end ) as '1001',
    (case when 字段2='1002' then 字段3 else '' end ) as '1002',
    (case when 字段2='1003' then 字段3 else '' end ) as '1003',
    (case when 字段2='1004' then 字段3 else '' end ) as '1004' from 表
    group by 字段1
      

  2.   

    slect 字段1,
          sum(case when 字段2='1001' then 字段3 end) as [1001],
          sum(case when 字段2='1002' then 字段3 end) as [1002],
          sum(case when 字段2='1003' then 字段3 end) as [1003],
          sum(case when 字段2='1004' then 字段3 end) as [1004],
    from talbename
    group by 字段1另,示例数据中没有字段1与字段2都相同的行,看不出你的组合要求是怎样的。
    还有,注意少用错别字。你的标题好吓人。
      

  3.   

    select a.字段1,(select 字段3 from 表 a1 where a1.字段1=a.字段1 and 字段2=1001) as [1001],(select 字段3 from 表 a2 where a2.字段1=a.字段1 and 字段2=1002) as [1002],
    (select 字段3 from 表 a3 where a3.字段1=a.字段1 and 字段2=1003) as [1003] from (select distinct 字段1 from 表)a
      

  4.   

    -- TEST:
    create table #Tmp(a varchar(3),b int,c int)
    insert #Tmp
    select 'aaa',1001,1465
    union all select 'bbb',1002,1124
    union all select 'ccc',1003,1257
    union all select 'ddd',1004,4855
    union all select 'aaa',1004,1144select * from #TmpSELECT  a,
    [1001] = MAX(CASE WHEN b = 1001 THEN c ELSE null END), 
    [1002] = MAX(CASE WHEN b = 1002 THEN c ELSE null END),
    [1003] = MAX(CASE WHEN b = 1003 THEN c ELSE null END),
    [1004] = MAX(CASE WHEN b = 1004 THEN c ELSE null END)
    FROM #Tmp
    GROUP BY a 
    ORDER BY aDROP TABLE #Tmp/*
    -- RESULT:
    a    b           c           
    ---- ----------- ----------- 
    aaa  1001        1465
    bbb  1002        1124
    ccc  1003        1257
    ddd  1004        4855
    aaa  1004        1144(所影响的行数为 5 行)a    1001        1002        1003        1004        
    ---- ----------- ----------- ----------- ----------- 
    aaa  1465        NULL        NULL        1144
    bbb  NULL        1124        NULL        NULL
    ccc  NULL        NULL        1257        NULL
    ddd  NULL        NULL        NULL        4855(所影响的行数为 4 行)
    */
      

  5.   

    补充一下,这里的1001,1002等数据都是随便输的测试数据,所以应该说不能在case中作为判断依据,因为真正的表中是些什么数据我们是不可预知的
      

  6.   

    看了上面的解答,大家都使用了CASE语句,我想虽然在程序里我可以用循环方法将SQL语句用字符串组织的方法组合出来,不过如果没有程序控制,就单独靠SQL自己的脚本,我就不知道该怎么写了,呵呵,哪位大侠能写一个通用的啊,不用判断是1001 还是1002的,以供大家参考^_^
      

  7.   

    --通用的,动态生成SQL.
    declare @s varchar(8000)
    set @s=''
    select @s=@s+',['+b+']=MAX(CASE b when '+b+' THEN c END)'
    from(select distinct b=cast(b as varchar) from 表) a
    exec('SELECT a'+@s+' FROM 表 GROUP BY a ORDER BY a')
    go
      

  8.   

    --如果要严格按照楼主的格式
    declare @s varchar(8000)
    set @s=''
    select @s=@s+',['+b+']=MAX(CASE b when '+b+' THEN cast(c as varchar) else '''' END)'
    from(select distinct b=cast(b as varchar) from 表) a
    exec('SELECT a'+@s+' FROM 表 GROUP BY a ORDER BY a')
    go
      

  9.   

    --下面是测试--测试数据
    create table 表(a varchar(3),b int,c int)
    insert 表
    select 'aaa',1001,1465
    union all select 'bbb',1002,1124
    union all select 'ccc',1003,1257
    union all select 'ddd',1004,4855
    union all select 'aaa',1004,1144
    go--查询处理
    declare @s varchar(8000)
    set @s=''
    select @s=@s+',['+b+']=MAX(CASE b when '+b+' THEN cast(c as varchar) else '''' END)'
    from(select distinct b=cast(b as varchar) from 表) a
    exec('SELECT a'+@s+' FROM 表 GROUP BY a ORDER BY a')
    go--删除测试表
    DROP TABLE 表/*--测试结果a    1001       1002       1003       1004       
    ---- ---------- ---------- ---------- ---------- 
    aaa  1465                             1144
    bbb             1124                  
    ccc                        1257       
    ddd                                   4855
    --*/
      

  10.   

    顶,用Rotaxe(程序员),gmlxf(烛光)的作法都是可行的!
      

  11.   

    --为方便调用,可以改成存储过程
    create proc p_qry
    as
    set nocount on
    declare @s varchar(8000)
    set @s=''
    select @s=@s+',['+b+']=MAX(CASE b when '+b+' THEN cast(c as varchar) else '''' END)'
    from(select distinct b=cast(b as varchar) from 表) a
    exec('SELECT a'+@s+' FROM 表 GROUP BY a ORDER BY a')
    set nocount off
    go--调用:
    exec p_qry
      

  12.   

    --为方便调用,可以改成存储过程
    create proc p_qry
    as
    set nocount on
    declare @s varchar(8000)
    set @s=''
    select @s=@s+',['+b+']=MAX(CASE b when '+b+' THEN cast(c as varchar) else '''' END)'
    from(select distinct b=cast(b as varchar) from 表) a
    exec('SELECT a'+@s+' FROM 表 GROUP BY a ORDER BY a')
    set nocount off
    go--调用:
    exec p_qry
      

  13.   

    行列交换
    试试这个语句:declare @sql varchar(8000)
    set @sql='select 字段1,'
    select @sql=@sql+',min(case 字段2 when ''' + cast(字段2 as varchar(4)) +''' then 字段3 else null end) as ['+字段2+']' from (select distinct 字段2 from table1) t1  
    set @sql=@sql+'from table1 group by 字段1'
    exec (@sql)
      

  14.   

    强啊,高手真多,呵呵,大家的方法都很好,zjcxc(邹建) 的方法好象通用性更高些(虽然不太看得明白,我太菜了,毕竟才初"血"者啊),哈哈,结贴了
      

  15.   

    不错,zjcxc(邹建),学习中....
    这里得到了一种行转列的通用方法!