有一个表TEST,字段有名字(name),人物动作执行类型(type),人物动作执行与否(yn),人物动作执行时间(time),这个time都要求每天执行一次,如果人物没执行动作可以为空。
现在要求写一条SQL前两列为name ,type,从第三列开始为时间(时间是天为单位,从有记录的第一天开始),但是时间列下面显示的是人物动作执行与否(yn),比如从2010年1月1日开始,那么到今天就是9个月加15天的列数。如下图所示:
           
           2010.1.1  2010.1.2  2010.1.3 。。
小明 吃饭  是         是         是    
小明 刷牙  是         是         是
小明 洗脸  否         是         是
小华 吃饭  是         是         是
小华 刷牙  是         是         是
小华 洗脸  是         是         是


。原始表结构:
name  type    yn    time
上面4列

解决方案 »

  1.   

     好像oracle对字段数目有限制的,不知道你超过没。
      

  2.   


    --你这个问题主要是行列都不固定,转换起来比较复杂,给你个固定的转换,比如201003到今天,参考下:WITH a AS(
    SELECT '小明' NAME ,'吃饭' TYPE ,'是' yn ,'20100913' tm FROM dual
    UNION ALL
    SELECT '小明','刷牙','是','20100913' FROM dual
    UNION ALL
    SELECT '小明','洗脸','否','20100913' FROM dual
    UNION ALL
    SELECT '小华','吃饭','是','20100913' FROM dual
    UNION ALL
    SELECT '小华','刷牙','是','20100913' FROM dual
    UNION ALL
    SELECT '小华','洗脸','否','20100913' FROM dual
    ),
    b AS(SELECT NAME,TYPE, yn,tm+LEVEL-1 tm FROM a CONNECT BY LEVEL<=Ceil(SYSDATE-To_Date(tm,'yyyymmdd')))
    SELECT NAME,TYPE,
    Max(Decode(tm,'20100913',yn)) "2010.09.13",
    Max(Decode(tm,'20100914',yn)) "2010.09.14",
    Max(Decode(tm,'20100915',yn)) "2010.09.15"
    FROM b
    GROUP BY NAME,type;结果:
    NAME  TYPE  2010.09.13  2010.09.14  2010.09.15
    ------------------------------------------------
    小华   刷牙       是             是             是
    小华   吃饭       是             是             是
    小华   洗脸       否             否             否
    小明   刷牙       是             是             是
    小明   吃饭       是             是             是
    小明   洗脸       否             否             否