编码 姓名 休假类型 休假天数      开始日期             结束日期
3 崔计周   病假    1 2006-06-05 6:00:00   2006-06-05 18:00:00
3 崔计周   病假    2 2006-06-06 6:00:00   2006-06-07 18:00:00
4 王玉梅  正常休假   1 2006-06-06 6:00:00   2006-06-06 18:00:00
4 王玉梅  正常休假  .5 2006-06-07 12:00:00 2006-06-07 18:00:00用select  编码,姓名,休假类型  sum(休假天数) as 休假总天数 from 休假纪录 group by 编码,姓名,休假类型 可以得到如下:
编码 姓名 休假类型 休假总天数
3 崔计周   病假   3
4 王玉梅   正常休假 1.5我想得到:
编码 姓名 休假类型 休假总天数  开始日期1 结束日期1  开始日期2 结束日期2 ......
3 崔计周   病假   3            ...       ...
4 王玉梅   正常休假 1.5          ...       ...请问该如何写才能得到呢????谢谢!!!

解决方案 »

  1.   

    sql语句办不到,写程序吧。除非用存储过程,可是本质上也是写程序。
      

  2.   

    如果某个人请假N次,最后的结果集中就有N个开始日期、N个结束日期?
    与其这样还不如处理原始的数据集呢:
    select 编码,姓名,休假类型,开始日期,结束日期,0 AS 累计天数 from 休假纪录 order by 编码,姓名,休假类型然后对该数据集操作,把同一个人同一种休假类型的天数累加到最后一个'累计天数'中。
      

  3.   

    行列转换,你参考下,
    //你的要求,用动态sql应该可以,不过我一时也写不出来create table a
    (col int)
    insert a select 1
    union select 2
    union select 3
    union select 4
    union select 5DECLARE @T_sql varchar(8000)
    set @T_sql=''
    select  @T_sql=@T_sql +  ' max(case when col=' + cast(col as varchar) + ' then col else 0 end) as ''' + cast(col as varchar) + ''',' from  A
    set @T_sql='select' + left(@T_sql,len(@T_sql)-1) + ' from A'
    select @T_sql
    exec (@T_sql)
    drop table A
      

  4.   

    没写出来,看写的这段,楼主或许可以在这个基础上改一下:
    create table #T (编码 int,
    姓名 varchar(32),
    休假类型 varchar(32),
    休假天数 real,      
    开始日期 datetime,
    结束日期 datetime)
    insert #T
    select
    3 ,'崔计周',   '病假',    1, '2006-06-05 6:00:00',   '2006-06-05 18:00:00'
    union select
    3 ,'崔计周',   '病假',    2 ,'2006-06-06 6:00:00',   '2006-06-07 18:00:00'
    union select
    4 ,'王玉梅',  '正常休假',   1 ,'2006-06-06 6:00:00',   '2006-06-06 18:00:00'
    union select
    4 ,'王玉梅',  '正常休假',  .5 ,'2006-06-07 12:00:00', '2006-06-07 18:00:00'select * from  #T
    --代码实现
    declare @sql varchar(1024)
    set @sql=''
    select @sql= @sql+
    ' max(case when 开始日期='''+convert(varchar(10),[开始日期], 120) +''' then 开始日期 else null end) as '''+
    convert(varchar(10),开始日期,120)+''','+' max(case when 结束日期='''+convert(varchar(10),[结束日期] ,120) +''' then 结束日期 else null end) as '''+
    convert(varchar(10),结束日期, 120)+''',' from #Tset @sql=' select 编码,姓名,休假类型,sum(休假天数) as 休假天数, '+left(@sql,len(@sql)-1)+' from #T'
    +' group by 编码,姓名,休假类型,休假天数'
    exec (@sql)

    --删除测试环境
    drop table #T
      

  5.   

    这个问题没有直接的函数可以实现,ding
      

  6.   

    想直接一句SQL搞定。不太可能啊。