比如说我的某一张表里面有以下数据:编码  担当者  日期
A     X       2009-08-07
A     Y       2009-08-08
A     Z       2009-08-09我需要的是让它显示成:编码 类别     2009-08-07   2009-08-08    2009-08-09A    担当者   X             Y             Z各位高手,能有什么好点的方法吗?
在线求救~~~

解决方案 »

  1.   

    *
    标题:普通行列转换(version 2.0)
    作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
    时间:2008-03-09
    地点:广东深圳
    说明:普通行列转换(version 1.0)仅针对sql server 2000提供静态和动态写法,version 2.0增加sql server 2005的有关写法。问题:假设有张学生成绩表(tb)如下:
    姓名 课程 分数
    张三 语文 74
    张三 数学 83
    张三 物理 93
    李四 语文 74
    李四 数学 84
    李四 物理 94
    想变成(得到如下结果): 
    姓名 语文 数学 物理 
    ---- ---- ---- ----
    李四 74   84   94
    张三 74   83   93
    -------------------
    */create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
    insert into tb values('张三' , '语文' , 74)
    insert into tb values('张三' , '数学' , 83)
    insert into tb values('张三' , '物理' , 93)
    insert into tb values('李四' , '语文' , 74)
    insert into tb values('李四' , '数学' , 84)
    insert into tb values('李四' , '物理' , 94)
    go--SQL SERVER 2000 静态SQL,指课程只有语文、数学、物理这三门课程。(以下同)
    select 姓名 as 姓名 ,
      max(case 课程 when '语文' then 分数 else 0 end) 语文,
      max(case 课程 when '数学' then 分数 else 0 end) 数学,
      max(case 课程 when '物理' then 分数 else 0 end) 物理
    from tb
    group by 姓名--SQL SERVER 2000 动态SQL,指课程不止语文、数学、物理这三门课程。(以下同)
    declare @sql varchar(8000)
    set @sql = 'select 姓名 '
    select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'
    from (select distinct 课程 from tb) as a
    set @sql = @sql + ' from tb group by 姓名'
    exec(@sql) --SQL SERVER 2005 静态SQL。
    select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,物理)) b--SQL SERVER 2005 动态SQL。
    declare @sql varchar(8000)
    select @sql = isnull(@sql + '],[' , '') + 课程 from tb group by 课程
    set @sql = '[' + @sql + ']'
    exec ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b')---------------------------------
      

  2.   

    这位仁兄能不能再说的仔细点啊,最好贴个SQL文出来啊~~
      

  3.   

    select 
    编码,
    类别='担当者',
    [2009-08-07]=MAX(case when convert(varchar(10),日期,120)='2009-08-07' then 担当者 else '' end),
    [2009-08-08]=MAX(case when convert(varchar(10),日期,120)='2009-08-08' then 担当者 else '' end),
    [2009-08-09]=MAX(case when convert(varchar(10),日期,120)='2009-08-09' then 担当者 else '' end)
    from tb 
    group by 编码
      

  4.   


    if object_id('[TB]') is not null drop table [TB]
    create table [TB]([编码] varchar(1),[担当者] varchar(1),[日期] varchar(10))
    insert [TB]
    select 'A','X','2009-08-07' union all
    select 'A','Y','2009-08-08' union all
    select 'A','Z','2009-08-09'declare @s nvarchar(4000)
    Select  @s=isnull(@s+',','')+quotename([日期])+'=max(case when [日期]='+quotename([日期],'''')+' then [担当者] else '''' end)'
    from TB 
    exec('select [编码],类别=''担当者'','+@s+' from [TB] group by [编码]')/*
    编码   类别     2009-08-07 2009-08-08 2009-08-09
    ---- ------ ---------- ---------- ----------
    A    担当者    X          Y          Z(1 行受影响)
    */
    drop table TB
      

  5.   

    -- =========================================
    -- -----------t_mac 小编-------------------
       --------------------希望有天成为大虾---- 
    -- =========================================IF OBJECT_ID('tb') IS NOT NULL
    DROP TABLE tb
    GO
    CREATE TABLE tb( 编码 varchar(10),担当者 varchar(10) ,日期 datetime)
    go
    insert tb SELECT 
    'A'  ,  'X' ,    '2009-08-07' UNION ALL SELECT 
    'A'  ,  'Y' ,     '2009-08-08' UNION ALL SELECT 
    'A'  ,  'Z',      '2009-08-09' 
    go
    select 
    编码,
    类别='担当者',
    [2009-08-07]=MAX(case when convert(varchar(10),日期,120)='2009-08-07' then 担当者 else '' end),
    [2009-08-08]=MAX(case when convert(varchar(10),日期,120)='2009-08-08' then 担当者 else '' end),
    [2009-08-09]=MAX(case when convert(varchar(10),日期,120)='2009-08-09' then 担当者 else '' end)
    from tb 
    group by 编码
    go
    /*
    编码         类别     2009-08-07 2009-08-08 2009-08-09
    ---------- ------ ---------- ---------- ----------
    A          担当者    X          Y          Z*/
      

  6.   

    ----------------------------------------------------------------
    -- Author :fredrickhu(小F 向高手学习)
    -- Date   :2009-08-10 18:54:06
    ----------------------------------------------------------------
    --> 测试数据:[tb]
    if object_id('[tb]') is not null drop table [tb]
    go
    create table [tb]([编码] varchar(1),[担当者] varchar(1),[日期] datetime)
    insert [tb]
    select 'A','X','2009-08-07' union all
    select 'A','Y','2009-08-08' union all
    select 'A','Z','2009-08-09'
    --------------开始查询--------------------------
    --静态
    select 
    编码,
    类别='担当者',
    [2009-08-07]=MAX(case when convert(varchar(10),日期,120)='2009-08-07' then 担当者 else '' end),
    [2009-08-08]=MAX(case when convert(varchar(10),日期,120)='2009-08-08' then 担当者 else '' end),
    [2009-08-09]=MAX(case when convert(varchar(10),日期,120)='2009-08-09' then 担当者 else '' end)
    from tb 
    group by 编码
    --动态
    declare @s nvarchar(4000)
    Select  @s=isnull(@s+',','')+quotename([日期])+'=max(case when [日期]='+quotename([日期],'''')+' then [担当者] else '''' end)'
    from tb 
    exec('select [编码],类别=''担当者'','+@s+' from [TB] group by [编码]')
    ----------------结果----------------------------
    /*编码   类别     2009-08-07 2009-08-08 2009-08-09
    ---- ------ ---------- ---------- ----------
    A    担当者    X          Y          Z*/
      

  7.   

    老蒋那个有个地方不太好 也许会重复 所以改进下declare @s nvarchar(4000)
    Select  @s=isnull(@s+',','')+quotename([日期])+'=max(case when [日期]='+quotename([日期],'''')+' then [担当者] else '''' end)'
    from (select distinct 日期 from TB ) k
    print @s
    exec('select [编码],类别=''担当者'','+@s+' from [TB] group by [编码]')