有数据: 
考核人 被考核人 考核方案ID  指标      分值 
A      B          1        领导能力  70 
A      C          1        管理能力  60 
A      C          1        领导能力  50 
A      B          1        管理能力  40 现在要把数据转换为: 
考核人 被考核人 考核方案ID  领导能力      管理能力 
A      B          1          70          40 
A      C          1          50          60 求这样的转换语句!在线等待!!!!
注意指标是变动的!!不止这些!!!

解决方案 »

  1.   

    2009-10-14 16:32:01http://topic.csdn.net/u/20091013/15/9f058df7-4d29-47bf-a338-b63fcab2abc0.html?51371 
      

  2.   

    ----------------------------------------------------------------
    -- Author  :fredrickhu(我是小F,向高手学习)
    -- Date    :2009-10-14 16:36:14
    -- Version:
    --      Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86) 
    -- Nov 24 2008 13:01:59 
    -- Copyright (c) 1988-2005 Microsoft Corporation
    -- Developer Edition on Windows NT 5.2 (Build 3790: Service Pack 1)
    --
    ----------------------------------------------------------------
    --> 测试数据:[tb]
    if object_id('[tb]') is not null drop table [tb]
    go 
    create table [tb]([考核人] varchar(1),[被考核人] varchar(1),[考核方案ID] int,[指标] varchar(8),[分值] int)
    insert [tb]
    select 'A','B',1,'领导能力',70 union all
    select 'A','C',1,'管理能力',60 union all
    select 'A','C',1,'领导能力',50 union all
    select 'A','B',1,'管理能力',40
    --------------开始查询--------------------------
    declare @sql varchar(8000)
    set @sql = 'select [考核人],被考核人, 考核方案ID'
    select @sql = @sql + ' , max(case 指标 when ''' + 指标 + ''' then 分值 else 0 end) [' + ltrim(指标) + ']'
    from (select distinct 指标 from tb) as a
    set @sql = @sql + ' from tb group by [考核人],被考核人, 考核方案ID'
    exec(@sql) ----------------结果----------------------------
    /* 考核人  被考核人 考核方案ID      管理能力        领导能力
    ---- ---- ----------- ----------- -----------
    A    B    1           40          70
    A    C    1           60          50(2 行受影响)
    */
      

  3.   

    declare @s varchar(8000)
    select @s=isnull(@s+',','')+'max(case 指标 when '''+指标+''' then 分值 else 0 end) as '+指标 from tb group by 指标
    exec('select 考核人,被考核人,考核方案ID,'+@s+' from tb group by 考核人,被考核人,考核方案ID')
     
      

  4.   

    --> 测试数据:[TB]
    if object_id('[TB]') is not null drop table [TB]
    create table [TB]([考核人] varchar(1),[被考核人] varchar(1),[考核方案ID] int,[指标] varchar(8),[分值] int)
    insert [TB]
    select 'A','B',1,'领导能力',70 union all
    select 'A','C',1,'管理能力',60 union all
    select 'A','C',1,'领导能力',50 union all
    select 'A','B',1,'管理能力',40select * from [TB]declare @s nvarchar(4000)
    set @s=''
    Select     @s=@s+','+quotename([指标])+'=max(case when [指标]='+quotename([指标],'''')+' then [分值] else 0 end)'
    from TB group by [指标]exec('select [考核人]=max(考核人),被考核人,指标=max(指标)'+@s+' from TB group by [被考核人]')/*
    考核人  被考核人 指标       管理能力        领导能力        
    ---- ---- -------- ----------- ----------- 
    A    B    领导能力     40          70
    A    C    领导能力     60          50*/drop table TB
      

  5.   

    if object_id('tb') is not null
    drop table tb
    go
    create table tb(考核人 nvarchar(10),被考核人 nvarchar(10),考核方案ID nvarchar(10), 指标 nvarchar(10),分值 int)
    go
    insert into tb select
    'A','B','  1','领导能力',  70  UNION ALL SELECT 
    'A','C','  1','管理能力',  60  UNION ALL SELECT 
    'A','C','  1','领导能力',  50  UNION ALL SELECT 
    'A','B','  1','管理能力',  40 
    declare @sql varchar(8000)
    set @sql = 'select 考核人,被考核人,考核方案ID '
    select @sql = @sql + ' , max(case 指标 when ''' + 指标 + ''' then 分值 else 0 end) [' + 指标 + ']'
    from (select distinct 指标 from tb) as aset @sql = @sql + '  from tb group by 考核人,被考核人,考核方案ID'
    exec(@sql) /*
    考核人        被考核人       考核方案ID     管理能力        领导能力        
    ---------- ---------- ---------- ----------- ----------- 
    A          B            1        40          70
    A          C            1        60          50
    */
      

  6.   

    if object_id('zc') is not null drop table zc
    go
    create table zc(khr varchar(5),bkhr varchar(5),khfa int,zb varchar(50),fs int)
    insert zc
    select 'A','B',1,'领导能力',70 union all
     select 'A','c',1,'管理能力',60 union all
    select 'A','c',1,'领导能力',50 union all
    select 'A','B',1,'管理能力',80--静态查询
    select t.khr,t.bkhr,t.khfa,
    max(case t.zb when '领导能力' then fs else 0 end) '领导能力',
         max(case t.zb when '管理能力' then fs else 0 end) '管理能力'
    from zc t
    group by t.khr,t.bkhr,t.khfa--动态查询
    --方法一
    declare @sql varchar(8000)
    set @sql='select khr,bkhr,khfa'
    select @sql=@sql+' , max(case zb when '''+zb+'''then fs else 0 end) ['+ltrim(zb)+']'
    from (select distinct zb from zc) as a
    set @sql=@sql+' from zc group by khr,bkhr,khfa'exec (@sql)--方法二
    declare @s varchar(8000)
    select @s=isnull(@s+',','')+'max(case zb when '''+zb+''' then fs else 0 end) as '+ltrim(zb) from zc group by zb
    exec('select khr,bkhr,khfa,'+@s+' from zc group by khr,bkhr,khfa')