首先排班信息表k15
主键  日期   班次名称,星期
a0188,d9999,k1500 ,k1506
人员信息表 a01主键  姓名  工号
a0188,a0101,a0190
怎么查询?下面的数据
日期 1 2 3 4 5 6 7 8 9 10 11
星期     星期六  星期一  星期二     星期三   星期四   星期五    星期六  星期日   星期一    星期二   星期三。。
姓名 白班1   白班1   休息       夜班     夜班     白班1     白班1   休息    夜班       夜班     白班1 
上面的日期也是当月的天数,
请各位高手帮帮忙?谢谢了。。

解决方案 »

  1.   


    declare @sql varchar(max)select b.a0101,a.d9999,a.k1500,a.k1506
      into #tb
    from k15 a join a01 b on a.a0188 = b.a0188select @sql = isnull(@sql+'select a0101')
    +',max(case when datepart(dd,d9999) = ' + ltrim(d9) + ' then k1506 else '''' end)[' + ltrim(d9) + ']'
    from(select distinct datepart(dd,d9999) d9 from #tb)t
    select @sql = @sql + ' from #tb group by a0101'
    select @sql = @sql + ' union all ' + replace(@sql,'k1506','k1500')
    exec(@sql)
    瞎猜,试试看。
      

  2.   

    declare @sql varchar(max)select b.a0101,a.d9999,a.k1500,a.k1506
      into #tb
    from k15 a join a01 b on a.a0188 = b.a0188select @sql = isnull(@sql+'select a0101')
                +',max(case when datepart(dd,d9999) = ' + ltrim(d9) + ' then k1506 else '''' end)[' + ltrim(d9) + ']'
    from(select distinct datepart(dd,d9999) d9 from #tb)t
    select @sql = @sql + ' from #tb group by a0101'
    select @sql = @sql + ' union all ' + replace(@sql,'k1506','k1500')
    exec(@sql)
    这个语法有问题
      

  3.   

    a01 表
    主键   姓名   人员编号
    a0188 a0101 a0190 
    数据
    65    LW     178k15表主键(a0188+日期)     日期           班次名称   星期
    a0188              d9999         k1500     k1506 
    65             2011-05-01       白班1      星期日
    65             2011-05-02       白班1      星期一
    65             2011-05-03       夜班        星期二
    65             2011-05-04       夜班        星期三
    65             2011-05-05       休息        星期四
    65             2011-05-06       休息        星期五。。
    等等一个月的排班信息结果
    日期   1        2       3       4       5        6 
    星期  星期日   星期一   星期二    星期三   星期四    星期五
    姓名  白班1    白班1    夜班     夜班      休息     休息就是这样的结果就行啊。。     
      

  4.   

    但是怎么写?drop table #tbdeclare @sql varchar(8000)
    select b.a0101,a.d9999,a.k1500,a.k1506
      into #tb
    from k15 a join a01 b on a.a0188 = b.a0188select @sql = isnull(@sql+'select a0101','')
                +',max(case when datepart(dd,d9999) = ' + ltrim(d9) + ' then k1506 else '''' end)[' + ltrim(d9) + ']'
    from(select distinct datepart(dd,d9999) d9 from #tb)t
    select @sql = @sql + ' from #tb group by a0101'
    select @sql = @sql + ' union all ' + replace(@sql,'k1506','k1500')
    exec(@sql)
    这段代码有什么问题?总是报错
      

  5.   

    --列值不确定时的动态转换
    create table a01(a0188 int,a0101 nvarchar(10),a0190 int)
    insert into a01 select 65,'LW',178
    insert into a01 select 66,'ZP',185
    create table k15(a0188 int,d9999 varchar(10),k1500 nvarchar(10),k1506 nvarchar(10))
    insert into k15 select 65,'2011-05-01','白班1','星期日'
    insert into k15 select 65,'2011-05-02','白班1','星期一'
    insert into k15 select 65,'2011-05-03','夜班','星期二'
    insert into k15 select 65,'2011-05-04','夜班','星期三'
    insert into k15 select 65,'2011-05-05','休息','星期四'
    insert into k15 select 65,'2011-05-06','休息','星期五'
    insert into k15 select 66,'2011-05-03','白班','星期二'
    go
    declare @s nvarchar(max)
    select a.a0101,b.d9999,b.k1500 into ##1 from a01 a left join k15 b on a.a0188=b.a0188 where left(b.d9999,7)='2011-05'
    select @s=isnull(@s+',','')+'['+ d9999 +']' from(
    select distinct [d9999] from ##1
    )t
    exec('select [a0101],'+@s+'from ##1 pivot (max([k1500]) for [d9999] in('+@s+'))b')
    /*
    a0101      2011-05-01 2011-05-02 2011-05-03 2011-05-04 2011-05-05 2011-05-06
    ---------- ---------- ---------- ---------- ---------- ---------- ----------
    LW         白班1        白班1        夜班         夜班         休息         休息
    ZP         NULL         NULL        白班          NULL        NULL        NULL(2 行受影响)*/
    go
    drop table a01,k15,##1
      

  6.   

    你这个是用sql2000做的吗?怎么总是出错?(所影响的行数为 0 行)服务器: 消息 241,级别 16,状态 1,行 3
    从字符串转换为 datetime 时发生语法错误。
      

  7.   


    create table a01(a0188 int,a0101 nvarchar(10),a0190 int)
    insert into a01 select 65,'LW',178
    insert into a01 select 66,'ZP',185
    create table k15(a0188 int,d9999 varchar(10),k1500 nvarchar(10),k1506 nvarchar(10))
    insert into k15 select 65,'2011-05-01','白班1','星期日'
    insert into k15 select 65,'2011-05-02','白班1','星期一'
    insert into k15 select 65,'2011-05-03','夜班','星期二'
    insert into k15 select 65,'2011-05-04','夜班','星期三'
    insert into k15 select 65,'2011-05-05','休息','星期四'
    insert into k15 select 65,'2011-05-06','休息','星期五'
    insert into k15 select 66,'2011-05-03','白班','星期二'
    godeclare @sql varchar(max)select b.a0101,a.d9999,a.k1500,a.k1506
      into #tb
    from k15 a join a01 b on a.a0188 = b.a0188select @sql = isnull(@sql,'select a0101')
                +',max(case when datepart(dd,d9999) = ' + ltrim(d9) + ' then k1506 else '''' end)[' + ltrim(d9) + ']'
    from(select distinct datepart(dd,d9999) d9 from #tb)t
    select @sql = @sql + ' from #tb group by a0101'
    select @sql = @sql + ' union all ' + replace(@sql,'k1506','k1500')
    exec(@sql)drop table a01,k15,#tb
    /***********a0101      1          2          3          4          5          6
    ---------- ---------- ---------- ---------- ---------- ---------- ----------
    LW         星期日        星期一        星期二        星期三        星期四        星期五
    ZP                               星期二                              
    LW         白班1        白班1        夜班         夜班         休息         休息
    ZP                               白班                               (4 行受影响)