网上SQL问题连载3

问题出处:http://topic.csdn.net/u/20091208/20/f8c6fb55-fcd9-4e1b-a798-855f7a44166d.html?68415

 

有某个表A,字段以及数据如下
--do_time  id  status  num  start_time  end_time
2009-12-2  21594  10  1  2009-12-2  2009-12-3
2009-12-6  21951  10  1  2009-12-6  2009-12-7
2009-12-7  21960  10  1  2009-12-7  2009-12-8
2009-12-7  23059  12  1  2009-12-7  2009-12-11
2009-12-7  23061  23  1  2009-12-7  2009-12-12

大家看到,有个do_time执行时间,还有一个start_time执行开始时间、end_time执行结束时间。num执行标记1(1为已执行,0未执行)
执行时间do_time一定是在start_time执行开始时间与end_time执行结束时间之间的某一天的。

现在的记录都是单条的,比如
2009-12-7  23059  12  0  2009-12-7  2009-12-11
记录
现在要变成5条记录,这5条记录就是从执行开始时间到执行结束时间,每一天一条记录。而且这些记录除了do_time字段跟num执行标记不一样以外,
剩下的字段数据都是一样的。
2009-12-7  23059  12  1  2009-12-7  2009-12-11
2009-12-8  23059  12  0  2009-12-7  2009-12-11
2009-12-9  23059  12  0  2009-12-7  2009-12-11
2009-12-10  23059  12  0  2009-12-7  2009-12-11
2009-12-11  23059  12  0  2009-12-7  2009-12-11

而且,每条记录都需要变成这样的,简单点说,就是加上未执行的天数的记录。
最后我要变成这样的数据如下:
2009-12-2  21594  10  1  2009-12-2  2009-12-3 --
2009-12-3  21594  10  0  2009-12-2  2009-12-3
2009-12-6  21951  10  1  2009-12-6  2009-12-7 --
2009-12-7  21951  10  0  2009-12-6  2009-12-7
2009-12-7  21960  10  1  2009-12-7  2009-12-8 --
2009-12-8  21960  10  0  2009-12-7  2009-12-8
2009-12-7  23059  12  1  2009-12-7  2009-12-11 --
2009-12-8  23059  12  0  2009-12-7  2009-12-11
2009-12-9  23059  12  0  2009-12-7  2009-12-11
2009-12-10  23059  12  0  2009-12-7  2009-12-11
2009-12-11  23059  12  0  2009-12-7  2009-12-11
2009-12-7  23061  23  1  2009-12-7  2009-12-12 --
2009-12-8  23061  23  0  2009-12-7  2009-12-12
2009-12-9  23061  23  0  2009-12-7  2009-12-12
2009-12-10  23061  23  0  2009-12-7  2009-12-12
2009-12-11  23061  23  0  2009-12-7  2009-12-12
2009-12-12  23061  23  0  2009-12-7  2009-12-12

我可以通过select ... from dual connect by ...之类的语句得到2009-12-7到2009-12-12之间所有的天数数据,
但是不知道如何跟原来的2009-12-7  23061  23  0  2009-12-7  2009-12-12结合起来形成一条记录。

大家熟悉,懂的,给点意见或者实例吧!谢了!

 

  1. WITH   
  2. TMP_A AS (  
  3.  SELECT A.DO_TIME,  
  4.         A.ID,  
  5.         A.STATUS,  
  6.         A.NUM,  
  7.         A.START_TIME,  
  8.         A.END_TIME,  
  9.         A.END_TIME - A.START_TIME + 1 AS DATE_B  
  10.   FROM A  
  11. ),  
  12. TMP_MAXDAY AS (  
  13.  SELECT MAX(A.END_TIME - A.START_TIME + 1) AS DATE_B  
  14.    FROM A  
  15. ),  
  16. TMP_DATE AS (  
  17.    SELECT LEVEL - 1 AS TMP_LEVEL   
  18.      FROM DUAL,TMP_MAXDAY   
  19.   CONNECT BY LEVEL <= TMP_MAXDAY.DATE_B  
  20. )  
  21.   
  22. SELECT TMP_A.DO_TIME + TMP_DATE.TMP_LEVEL AS DO_TIME,  
  23.        TMP_A.ID,  
  24.        TMP_A.STATUS,  
  25.        CASE WHEN TMP_DATE.TMP_LEVEL > 0 THEN 0  
  26.        ELSE TMP_A.NUM END AS NUM,  
  27.        TMP_A.START_TIME,  
  28.        TMP_A.END_TIME  
  29. FROM  
  30. TMP_A,  
  31. TMP_DATE  
  32. WHERE  
  33. TMP_DATE.TMP_LEVEL < TMP_A.DATE_B  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值