TB1 有字段:姓名;月份;1日;2日;........31日 (日期字段中放的是部门ID——在哪个部门上班)现在我需要建立一张视图,将某人对应某天变成一条记录显示。横表转纵表!也就是变成 TB2 有字段: 姓名;日期;部门 

解决方案 »

  1.   

    with tb1 as (
    select '张三' fname,'201007' month_id, '部门1' f1, '部门2' f2, '部门3' f3, '部门4' f4
    from dual
    ),
    tb2 as (
        select rownum day_id from dual
        connect by rownum <= 31
    )
    select tb1.fname,tb1.month_id,tb2.day_id,
        decode(tb2.day_id,1,tb1.f1,2,f2,3,f3,4,f4) f_department
    from tb1,tb2
      

  2.   

    修改一下楼上的,另外 31 应该根据月份得到。 而且1日;2日;........31日  的字段没列安么多,所以decode函数里应该全部列出。with tb1 as (
         select '张三' fname,'201007' month_id, 'A' f1, 'A' f2, 'B' f3, 'D' f4 from dual union all 
         select '斯大林' fname,'201007' month_id, 'F' f1, 'A' f2, 'B' f3, 'SDG' f4 from dual union all 
         select '啊毛' fname,'201007' month_id, 'V' f1, 'F' f2, 'E' f3, 'D' f4 from dual
    ),
    tb2 as (
      select rownum day_id from dual
      connect by rownum <= to_number(to_char(last_day(to_date('201007', 'yyyymm')), 'dd'))
    )select 
           tb1.fname,
           tb1.month_id,
           tb2.day_id,
           decode(tb2.day_id, 1, tb1.f1, 2, f2, 3, f3, 4, f4) f_department
      from tb1, tb2
     group by tb1.fname, tb1.month_id, tb2.day_id, decode(tb2.day_id, 1, tb1.f1, 2, f2, 3, f3, 4, f4)
     order by tb1.fname
     FNAME MONTH_ID DAY_ID F_DEPARTMENT
    啊毛 201007 1 V
    啊毛 201007 2 F
    啊毛 201007 3 E
    啊毛 201007 4 D
    啊毛 201007 5
    啊毛 201007 6
    啊毛 201007 7
    啊毛 201007 8
    啊毛 201007 9
    啊毛 201007 10
    啊毛 201007 11
    啊毛 201007 12
    啊毛 201007 13
    啊毛 201007 14
    啊毛 201007 15
    啊毛 201007 16
    啊毛 201007 17
    啊毛 201007 18
    啊毛 201007 19
    啊毛 201007 20
    啊毛 201007 21
    啊毛 201007 22
    啊毛 201007 23
    啊毛 201007 24
    啊毛 201007 25
    啊毛 201007 26
    啊毛 201007 27
    啊毛 201007 28
    啊毛 201007 29
    啊毛 201007 30
    啊毛 201007 31
    斯大林 201007 1 F
    斯大林 201007 2 A
    斯大林 201007 3 B
    斯大林 201007 4 SDG
    斯大林 201007 5
    斯大林 201007 6
    斯大林 201007 7
    斯大林 201007 8
    斯大林 201007 9
    斯大林 201007 10
    斯大林 201007 11
    斯大林 201007 12
    斯大林 201007 13
    斯大林 201007 14
    斯大林 201007 15
    斯大林 201007 16
    斯大林 201007 17
    斯大林 201007 18
    斯大林 201007 19
    斯大林 201007 20
    斯大林 201007 21
    斯大林 201007 22
    斯大林 201007 23
    斯大林 201007 24
    斯大林 201007 25
    斯大林 201007 26
    斯大林 201007 27
    斯大林 201007 28
    斯大林 201007 29
    斯大林 201007 30
    斯大林 201007 31
    张三 201007 1 A
    张三 201007 2 A
    张三 201007 3 B
    张三 201007 4 D
    张三 201007 5
    张三 201007 6
    张三 201007 7
    张三 201007 8
    张三 201007 9
    张三 201007 10
    张三 201007 11
    张三 201007 12
    张三 201007 13
    张三 201007 14
    张三 201007 15
    张三 201007 16
    张三 201007 17
    张三 201007 18
    张三 201007 19
    张三 201007 20
    张三 201007 21
    张三 201007 22
    张三 201007 23
    张三 201007 24
    张三 201007 25
    张三 201007 26
    张三 201007 27
    张三 201007 28
    张三 201007 29
    张三 201007 30
    张三 201007 31
      

  3.   

    楼上的是对的改一下:with tb1 as (
    select '张三' fname,'201007' month_id, '部门1' f1, '部门2' f2, '部门3' f3, '部门4' f4
    from dual
    ),
    tb2 as (
      select rownum day_id from dual
      connect by rownum < 31
    )
    select tb1.fname 姓名,tb1.month_id||to_char(tb2.day_id,'00') 日期,
      decode(tb2.day_id,1,tb1.f1,2,f2,3,f3,4,f4) 部门
    from tb1,tb2
      

  4.   

    我用这个SQL语句实现了,能不能帮忙再优化一下(把2月31日,4月31日之类不存在的日期数据去掉)
    select username,tmonth||'01',D1 from TB1
    union all  
    select username,tmonth||'02',D2 from TB1
    union all  
    select username,tmonth||'03',D3 from TB1