表 A(工号,姓名,部门)
1001,王飞,生产部
1002,紫江,生产部
1003,徐思,生产部
1004,张磊, 生产部
1010,许胜,质量部
1011,王忠,质量部
1012,钱圩,质量部
1013,党红,质量部
1014,黄韵,质量部
1015,沈将,质量部
1020,韩斐,办公室
1021,王云,办公室要求输出结果为:序号   办公室    生产部    质量部
1        韩斐      王飞      许胜
2        王云      紫江      钱圩
3        null      徐思      党红
4        null      张磊      黄韵
5        null      null      沈将

解决方案 »

  1.   

    select ROW_NUMBER() over (order by getdate()) as 序号,*
    from a pivot (
    max(姓名) for 部门 in ([办公室],[生产部],[质量部])
    )l
      

  2.   

    select 
    序号=identity(int,1,1) ,
    办公室=MAX(case when 部门='办公室' then 姓名 end),
    生产部=MAX(case when 部门='生产部' then 姓名 end),
    质量部=MAX(case when 部门='质量部' then 姓名 end)
    into #
    from a select * from #
      

  3.   

    SELECT RIGHT(工号,1)AS 序号,
    CASE WHEN 部门='办公室 ' THEN 姓名 END AS 办公室 ,
    CASE WHEN 部门='生产部 ' THEN 姓名 END AS 生产部 ,
    CASE WHEN 部门='质量部  ' THEN 姓名 END AS 质量部  
    FROM TB GROUP BY RIGHT(工号,1)
      

  4.   

    declare @sql varchar(8000)
    set @sql =''
    select @sql = @sql + ',max(case 部门 when ''' + 部门 + ''' then 姓名 end) as ['+ 部门 + ']'
    from a
    group by 部门exec('
      select 序号'+@sql+' from (select * ,(select count(1) from a where 部门 = x.部门 and 工号<=x.工号) as 序号
      from a x
      ) as t
      group by 序号
      ')
      

  5.   

    ---测试数据---
    if object_id('[A]') is not null drop table [A]
    go
    create table [A]([工号] int,[姓名] varchar(4),[部门] varchar(6))
    insert [A]
    select 1001,'王飞','生产部' union all
    select 1002,'紫江','生产部' union all
    select 1003,'徐思','生产部' union all
    select 1004,'张磊','生产部' union all
    select 1010,'许胜','质量部' union all
    select 1011,'王忠','质量部' union all
    select 1012,'钱圩','质量部' union all
    select 1013,'党红','质量部' union all
    select 1014,'黄韵','质量部' union all
    select 1015,'沈将','质量部' union all
    select 1020,'韩斐','办公室' union all
    select 1021,'王云','办公室'
     
    ---查询---
    SELECT 
      A.PX AS 序号,
      max(CASE WHEN B.部门='办公室' THEN B.姓名 END) AS 办公室,
      max(CASE WHEN B.部门='生产部' THEN B.姓名 END)AS 生产部,
      max(CASE WHEN B.部门='质量部' THEN B.姓名 END) AS 质量部
    FROM
    (
    SELECT 
      DISTINCT PX
    FROM
    (select *,px=(select count(1)+1 from A where 部门=t.部门 and 工号<t.工号) from A t) TT
    ) A
    LEFT JOIN
    (select *,px=(select count(1)+1 from A where 部门=t.部门 and 工号<t.工号) from A t) B
    ON
      A.PX=B.PX
    group by
      a.px---结果---序号          
    办公室  生产部  质量部  
    ----------- ---- ---- ---- 
    1           韩斐   王飞   许胜
    2           王云   紫江   王忠
    3           NULL 徐思   钱圩
    4           NULL 张磊   党红
    5           NULL NULL 黄韵
    6           NULL NULL 沈将(所影响的行数为 6 行)
      

  6.   

    -->Title:生成測試數據
    -->Author:wufeng4552【水族杰纶】
    -->Date :2009-08-25 10:14:19 
    declare @A table([工号] int,[姓名] nvarchar(2),[部门] nvarchar(3))
    Insert @A
    select 1001,N'王飞',N'生产部' union all
    select 1002,N'紫江',N'生产部' union all
    select 1003,N'徐思',N'生产部' union all
    select 1004,N'张磊',N'生产部' union all
    select 1010,N'许胜',N'质量部' union all
    select 1011,N'王忠',N'质量部' union all
    select 1012,N'钱圩',N'质量部' union all
    select 1013,N'党红',N'质量部' union all
    select 1014,N'黄韵',N'质量部' union all
    select 1015,N'沈将',N'质量部' union all
    select 1020,N'韩斐',N'办公室' union all
    select 1021,N'王云',N'办公室'
    select 
          序号=row_number()over(order by getdate()), 
          c.[姓名],
          b.[姓名],
          a.[姓名]
    from (select ID=row_number()over (order by getdate()),[姓名] from @a where [部门]=N'质量部')a
    left join 
    (select ID=row_number()over (order by getdate()),[姓名] from @a where [部门]=N'生产部')b
    on a.id=b.id
    left join 
    (select ID=row_number()over (order by getdate()),[姓名] from @a where [部门]=N'办公室')c
    on a.id=c.id
    /*
    序号                   姓名   姓名   姓名
    -------------------- ---- ---- ----
    1                    韩斐   王飞   许胜
    2                    王云   紫江   王忠
    3                    NULL 徐思   钱圩
    4                    NULL 张磊   党红
    5                    NULL NULL 黄韵
    6                    NULL NULL 沈将(6 個資料列受到影響)
    */
      

  7.   

    --========+++++++++++++++++++++++++++++++++++==========
    --======= 每天都在进步,却依然追不上地球的自传=========
    --======= By: zc_0101 At:2009-08-25 10:19:56=========
    --========++++++++++++++++++++++++++++++++++++=========
    --> 测试数据: #T
    if object_id('tempdb.dbo.#T') is not null drop table #T
    create table #T (工号 int,姓名 varchar(4),部门 varchar(6))
    insert into #T
    select 1001,'王飞','生产部' union all
    select 1002,'紫江','生产部' union all
    select 1003,'徐思','生产部' union all
    select 1004,'张磊','生产部' union all
    select 1010,'许胜','质量部' union all
    select 1011,'王忠','质量部' union all
    select 1012,'钱圩','质量部' union all
    select 1013,'党红','质量部' union all
    select 1014,'黄韵','质量部' union all
    select 1015,'沈将','质量部' union all
    select 1020,'韩斐','办公室' union all
    select 1021,'王云','办公室'select * from #T
    ----------------查询------------ 
    select row_number() over(order by getdate()) 序号,a.办公室,b.生产部,c.质量部 from 
    (
    select row=row_number() over (order by 办公室 desc),办公室 from #T
    pivot (max(姓名) for 部门 in(办公室)) as t  where 办公室 is not null
    ) a
    full join 
    (
    select row=row_number() over (order by 生产部 desc),生产部 from #T
    pivot (max(姓名) for 部门 in(生产部)) as t where 生产部 is not null
    ) b on a.row=b.row 
    full join 
    (
    select row=row_number() over (order by 质量部 desc),质量部 from #T
    pivot (max(姓名) for 部门 in(质量部)) as t  where 质量部 is not null
    ) c
    on b.row=c.row   ----------------结果--------------
    /*
    序号 办公室 生产部 质量部
    1 王云 紫江 许胜
    2 韩斐 张磊 王忠
    3 NULL 徐思 沈将
    4 NULL 王飞 钱圩
    5 NULL NULL 党红
    6 NULL NULL 黄韵
    */
      

  8.   

    --借树哥数据
    ---测试数据---
    if object_id('[A]') is not null drop table [A]
    go
    create table [A]([工号] int,[姓名] varchar(4),[部门] varchar(6))
    insert [A]
    select 1001,'王飞','生产部' union all
    select 1002,'紫江','生产部' union all
    select 1003,'徐思','生产部' union all
    select 1004,'张磊','生产部' union all
    select 1010,'许胜','质量部' union all
    select 1011,'王忠','质量部' union all
    select 1012,'钱圩','质量部' union all
    select 1013,'党红','质量部' union all
    select 1014,'黄韵','质量部' union all
    select 1015,'沈将','质量部' union all
    select 1020,'韩斐','办公室' union all
    select 1021,'王云','办公室'
     
    ---查询---
    declare @sql varchar(8000)
    set @sql =''
    select @sql = @sql + ',max(case 部门 when ''' + 部门 + ''' then 姓名 end) as ['+ 部门 + ']'
    from a
    group by 部门exec('select 序号'+@sql+' from (select * ,(select count(1) from a where 部门 = x.部门 and 工号<=x.工号) as 序号from a x) as tgroup by 序号')
    /*序号          办公室  生产部  质量部
    ----------- ---- ---- ----
    1           韩斐   王飞   许胜
    2           王云   紫江   王忠
    3           NULL 徐思   钱圩
    4           NULL 张磊   党红
    5           NULL NULL 黄韵
    6           NULL NULL 沈将
    警告: 聚合或其他 SET 操作消除了空值。(6 行受影响)*/
      

  9.   


    这个不错,不过有警告: 聚合或其他 SET 操作消除了空值。。
      

  10.   


    不影响查询结果,如果你想它不警告,可以改一下这段declare @sql varchar(8000)
    set @sql =''
    select @sql = @sql + ',max(case 部门 when ''' + 部门 + ''' then 姓名  esle '''' end) as ['+ 部门 + ']'
    from a
    group by 部门