排班表序号  年份 月份 日期1              日期2        日期3  日期4
P20110211    2011   1  张三               张三        张三   李四
P20110212    2011   2  张三/李四/王五      李四        赵六   赵六
P20110213    2011   3  钱三               钱三        钱三   钱三
转换到表:
排班表序号 排班日期 姓名
P20110211          2011-1-1 张三
P20110211   2011-1-2 张三
P20110211  2011-1-3 张三
P20110211  2011-1-4 李四
P20110212          2011-2-1 王五
P20110213          2011-2-2 李四
P20110214  2011-2-3 赵六
P20110212  2011-2-1 李四
P20110212          2011-2-1 王五
….             …. …..
谢谢 !!!!!!!!!!

解决方案 »

  1.   

    --> --> (Roy)生成測試數據
     
    if not object_id('Tempdb..#1') is null
    drop table #1
    Go
    Create table #1([排班表序号] nvarchar(9),[年份] int,[月份] int,[日期1] nvarchar(20),[日期2] nvarchar(20),[日期3] nvarchar(20),[日期4] nvarchar(20))
    Insert #1
    select N'P20110211',2011,1,N'张三',N'张三',N'张三',N'李四' union all
    select N'P20110212',2011,2,N'张三/李四/王五',N'李四',N'赵六',N'赵六' union all
    select N'P20110213',2011,3,N'钱三',N'钱三',N'钱三',N'钱三'
    Go
    ;with Tab1
    as
    (
    Select 
    [排班表序号], 
    [排班日期]=rtrim([年份])+right(100+[月份],2)+case when ColName='日期1' then '01' when ColName='日期2' then '02' when ColName='日期3' then '03' when ColName='日期4' then '04'  end,
    [StaffNames]
    from #1 as a
    unpivot
    ([StaffNames] for ColName in([日期1],[日期2],[日期3],[日期4]))b
    )
    ,Tab2
    as
    (
    select [排班表序号],[排班日期],[StaffName]=cast(left([StaffNames],charindex('/',[StaffNames]+'/')-1) as nvarchar(4000)),cast(STUFF(StaffNames,1,charindex('/',StaffNames+'/'),'') as nvarchar(1000)) as StaffNames from Tab1
    union all
    select [排班表序号],[排班日期],[StaffName]=cast(left([StaffNames],charindex('/',[StaffNames]+'/')-1) as nvarchar(4000)),cast(STUFF(StaffNames,1,charindex('/',StaffNames+'/'),'') as nvarchar(1000)) as StaffNames from Tab2 where StaffNames>''
    )
    select
    [排班表序号],[排班日期],[StaffName] 
    from Tab2  option (MAXRECURSION 0)
    /*
    排班表序号 排班日期 StaffName
    P20110211 20110101 张三
    P20110211 20110102 张三
    P20110211 20110103 张三
    P20110211 20110104 李四
    P20110212 20110201 张三
    P20110212 20110202 李四
    P20110212 20110203 赵六
    P20110212 20110204 赵六
    P20110213 20110301 钱三
    P20110213 20110302 钱三
    P20110213 20110303 钱三
    P20110213 20110304 钱三
    P20110212 20110201 李四
    P20110212 20110201 王五
    */
      

  2.   

    谢谢您给我的答复!能不能给一个通用一点的呢?
    第一个表
    排班表序号 年份 月份 日期1         日期2    日期3 日期4  日期5 ......日期31
    P20110211 2011 1   张三           张三      张三  李四
    P20110212 2011 2   张三/李四/王五 李四            赵六
    P20110213 2011 3   钱三                     钱三  张三/钱三/王五
    记录数不止三条,有上千条.  而且某个日期下还有可能没有安排人的!人员也不限于上面给出的几位.
    然后得到第二张表!!谢谢!老师!
    期待您的回复