2013-04-05 51 views
0

我没有要求在下面的方式来检索数据周基于计数

Weeks delay_count 
0   6   
1   0 
2   3 
3   4 
4   0 
5   1   
6   0 
7   0  
8   0  
9   0 
10   2 
11   0   
12   0  
13   0  
14   0 
15   3 

这里周是硬编码的列0至15和delay_count是派生列。我有一列delay_weeks。基于此列中的值,我需要填充delay_count列(派生列)中的值

delay_weeks列值在下面。

blank 
blank 
blank 
2 
10 
5 
blank 
3 
2 
10 
2 
3 
3 
3 
0 
0 
15 
22 
29 

条件:

  • delay_weeks为空白或0,那么在delay_count列计数应为1
  • delay_weeks是3,那么在delay_count列计数应为13周下
  • delay_weeks为10时,则在delay_count列中计数应该在第10周时为1
  • delay_weeks大于或等于15然后在delay_count列中的数应1周下15.

我写像下面

SELECT "Weeks", a."delay_count" 
    FROM (SELECT  LEVEL AS "Weeks" 
       FROM DUAL 
      CONNECT BY LEVEL <= 15) m, 
     (SELECT VALUE, COUNT (VALUE) AS "delay_numbers" 
       FROM (SELECT CASE 
              WHEN attr11.VALUE >= 15 
              THEN '15' 
              ELSE attr11.VALUE 
             END 
            VALUE 
         FROM docs, 
          (SELECT object_id, VALUE, attribute_type_id 
           FROM ATTRIBUTES 
          WHERE attribute_type_id = 
             (SELECT attribute_type_id 
             FROM attribute_types 
             WHERE name_display_code = 
               'ATTRIBUTE_TYPE.DELAY IN WEEKS')) attr11 
        WHERE docs.obj_id = attr11.object_id(+) 

      GROUP BY VALUE) a 
    WHERE m."Weeks" = a.VALUE(+) 
代码
+2

您有具体问题吗?这些是你的要求,但你的编程问题是什么? – 2013-04-05 14:24:48

+0

嗨约翰,我有一个叫Delay的报告。在这份报告中我需要数周和延迟计数。 – ravt 2013-04-05 14:28:23

+0

这并不能回答John的问题。你试过了什么?本网站旨在帮助解决特定的编程问题,而不是为您编写代码。你需要至少展示一些努力。 – 2013-04-05 14:30:20

回答

1
select 
    weeks, 
    nvl(cnt, 0) as delay_count 
from 
    (select level-1 as weeks from dual connect by level < 17) 
    left join (
    select 
     nvl(least(attr11.value, 15), 0) as weeks, 
     count(0) as cnt 
    from 
     DOCS 
     left join (
     ATTRIBUTES attr11 
     join ATTRIBUTE_TYPES atr_tp using(attribute_type_id) 
    ) 
     on atr_tp.name_display_code = 'ATTRIBUTE_TYPE.DELAY IN WEEKS' 
     and docs.obj_id = attr11.object_id 
    group by nvl(least(attr11.value, 15), 0) 
) using(weeks) 
order by 1 
1

逆向工程的表格定义的相关部分,我想这给你你想要的:

select t.weeks, count(delay) as delay_count 
from (select level - 1 as weeks from dual connect by level <= 16) t 
left join (
    select case when a.value is null then 0 
     when to_number(a.value) > 15 then 15 
     else to_number(a.value) end as delay 
    from docs d 
    left join (
     select a.object_id, a.value 
     from attributes a 
     join attribute_types at on at.attribute_type_id = a.attribute_type_id 
     where at.name_display_code = 'ATTRIBUTE_TYPE.DELAY IN WEEKS' 
    ) a on a.object_id = d.obj_id 
) delays on delays.delay = t.weeks 
group by t.weeks 
order by t.weeks; 

有了什么,我认为是匹配的数据,我得到:

 WEEKS DELAY_COUNT 
---------- ----------- 
     0   6 
     1   0 
     2   3 
     3   4 
     4   0 
     5   1 
     6   0 
     7   0 
     8   0 
     9   0 
     10   2 
     11   0 
     12   0 
     13   0 
     14   0 
     15   3 

但很明显,因为你没有给我猜的关系有点真正的表结构。强制要求SQL Fiddle

+0

@EgorSkriptunoff - 确实;我已经注意到并更新了修复attributes/attributes_type连接。谢谢。 – 2013-04-05 15:43:09