我现在的数据是这样的:
日期        编号   星期    内容
2009/01/01  0001   星期一  9:00 开会
2009/01/02  0001   星期二  10:00 杀人
2009/01/03  0001   星期三  9:00 开会
2009/01/04  0001   星期四  10:00 杀人
2009/01/05  0001   星期五  9:00 开会
2009/01/01  0002   星期一  10:00 杀人
2009/01/02  0002   星期二  9:00 开会
2009/01/03  0002   星期三  10:00 杀人
2009/01/04  0002   星期四  9:00 开会
2009/01/05  0002   星期五  10:00 杀人我想要的结果是:
编号    星期一      星期二      星期三      星期四      星期五      星期六      星期天
0001    9:00 开会   10:00 杀人  9:00 开会   10:00 杀人  9:00 开会
0002    10:00 杀人  9:00 开会   10:00 杀人  9:00 开会   10:00 杀人
备注:
  1. 日期和编号是主键.
  2. 网上行转列的问题我也有试过,达不到我想要的效果
  3. 望求高人,速结

解决方案 »

  1.   

    http://topic.csdn.net/u/20080614/17/22e73f33-f071-46dc-b9bf-321204b1656f.html
      

  2.   


    if object_id('tb')is not null drop table tb
    go 
    create table tb(日期 datetime,编号 varchar(4),星期 varchar(10),内容 varchar(20))
    insert tb select 
    '2009/01/01',  '0001',  '星期一',  '9:00 开会' union all select 
    '2009/01/02',  '0001',  '星期二',  '10:00 杀人' union all select 
    '2009/01/03',  '0001',  '星期三',  '9:00 开会' union all select 
    '2009/01/04',  '0001',  '星期四',  '10:00 杀人' union all select 
    '2009/01/05',  '0001',  '星期五',  '9:00 开会' union all select 
    '2009/01/01',  '0002',  '星期一',  '10:00 杀人' union all select 
    '2009/01/02',  '0002',  '星期二',  '9:00 开会' union all select 
    '2009/01/03',  '0002',  '星期三',  '10:00 杀人' union all select 
    '2009/01/04',  '0002',  '星期四',  '9:00 开会' union all select 
    '2009/01/05' , '0002',  '星期五',  '10:00 杀人' --select * from tb 
    declare @s varchar(4000)
    select @s=isnull(@s+',','')+'max(case when 星期='''+星期+''' then 内容 else '''' end) ['+星期+']'
    from (
    select '星期一' as 星期 union all 
    select '星期二' union all 
    select '星期三' union all 
    select '星期四' union all 
    select '星期五' union all 
    select '星期六' union all 
    select '星期日' )tset @s='select 编号,'+@s+' from tb group by 编号'exec(@s)
    编号   星期一                  星期二                  星期三                  星期四                  星期五                  星期六                  星期日
    ---- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- --------------------
    0001 9:00 开会              10:00 杀人             9:00 开会              10:00 杀人             9:00 开会                                   
    0002 10:00 杀人             9:00 开会              10:00 杀人             9:00 开会              10:00 杀人                                  (2 行受影响)
      

  3.   


    都试过,达不到我要的效果,注意,教程中用的是max等函数,我这里都是string
    不过还是要谢谢上面这位兄弟
      

  4.   

    if object_id('tb')is not null drop table tb
    go 
    create table tb(日期 datetime,编号 varchar(4),星期 varchar(10),内容 varchar(20))
    insert tb select 
    '2009/01/01',  '0001',  '星期一',  '9:00 开会' union all select 
    '2009/01/02',  '0001',  '星期二',  '10:00 杀人' union all select 
    '2009/01/03',  '0001',  '星期三',  '9:00 开会' union all select 
    '2009/01/04',  '0001',  '星期四',  '10:00 杀人' union all select 
    '2009/01/05',  '0001',  '星期五',  '9:00 开会' union all select 
    '2009/01/01',  '0002',  '星期一',  '10:00 杀人' union all select 
    '2009/01/02',  '0002',  '星期二',  '9:00 开会' union all select 
    '2009/01/03',  '0002',  '星期三',  '10:00 杀人' union all select 
    '2009/01/04',  '0002',  '星期四',  '9:00 开会' union all select 
    '2009/01/05' , '0002',  '星期五',  '10:00 杀人' select 
      编号,
      max(case when 星期='星期一' then 内容 else '' end) [星期一],
      max(case when 星期='星期二' then 内容 else '' end) [星期二],
      max(case when 星期='星期三' then 内容 else '' end) [星期三],
      max(case when 星期='星期四' then 内容 else '' end) [星期四],
      max(case when 星期='星期五' then 内容 else '' end) [星期五],
      max(case when 星期='星期六' then 内容 else '' end) [星期六],
      max(case when 星期='星期日' then 内容 else '' end) [星期日] 
    from 
      tb 
    group by 
      编号
    /*
    (10 行受影响)
    编号   星期一                  星期二                  星期三                  星期四                  星期五                  星期六                  星期日
    ---- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- --------------------
    0001 9:00 开会              10:00 杀人             9:00 开会              10:00 杀人             9:00 开会                                   
    0002 10:00 杀人             9:00 开会              10:00 杀人             9:00 开会              10:00 杀人                                  (2 行受影响)*/
      

  5.   


    if object_id('tb') is not null
    drop table tb
    go
    Create Table tb(日期 dateTime,编号 nvarchar(20),星期 nvarchar(20),内容 nvarchar(20))
    go
    ---生成测试数据
    insert into tb select 
    '2009/01/01','0001','星期一','9:00 开会' union all select
    '2009/01/02','0001','星期二','10:00 杀人' union all select 
    '2009/01/03','0001','星期三','9:00 开会' union all select 
    '2009/01/04','0001','星期四','10:00 杀人' union all select 
    '2009/01/05','0001','星期五','9:00 开会' union all select 
    '2009/01/01','0002','星期一','10:00 杀人' union all select 
    '2009/01/02','0002','星期二','9:00 开会' union all select 
    '2009/01/03','0002','星期三','10:00 杀人' union all select 
    '2009/01/04','0002','星期四','9:00 开会' union all select 
    '2009/01/05','0002','星期五','10:00 杀人' 
    goselect * from tb
    declare @s nvarchar(4000)
    set @s=''
    Select     @s=@s+','+quotename([星期])+'=max(case when [星期]='+quotename([星期],'''')+' then [内容] else null end)'
    from tb group by[星期]set @s='select [编号]'+@s+' from tb group by [编号]'exec(@s) 
    /*
    编号                   星期二                  星期三                  星期四                  星期五                  星期一
    -------------------- -------------------- -------------------- -------------------- -------------------- --------------------
    0001                 10:00 杀人             9:00 开会              10:00 杀人             9:00 开会              9:00 开会
    0002                 9:00 开会              10:00 杀人             9:00 开会              10:00 杀人             10:00 杀人
    */