oracle sum over()with where子句

时间:2016-04-19 11:04:50

标签: oracle grouping

enter image description here
它应该是这样的。

另一个特殊问题。我有以下数据和查询:

with helptab as (  
select '6762' as nr, 'A' as sub_val, 0 as sub_nr from dual  
union all  
select '6762' as nr, 'A' as sub_val, 0 as sub_nr from dual    
union all  
select '6762' as nr, 'A' as sub_val, 0 as sub_nr from dual    
union all    
select '6762' as nr, 'A' as sub_val, 0 as sub_nr from dual  
union all  
select '6762' as nr, 'A' as sub_val, 0 as sub_nr from dual  
union all    
select '6762' as nr, 'A' as sub_val, 0 as sub_nr from dual  
union all  
select '6762' as nr, 'A' as sub_val, 0 as sub_nr from dual  
union all  
select '6763' as nr, 'B' as sub_val, 0 as sub_nr from dual  
union all  
select '6763' as nr, 'B' as sub_val, 0 as sub_nr from dual  
union all  
select '6763' as nr, 'B' as sub_val, 0 as sub_nr from dual  
union all  
select '6763' as nr, 'B' as sub_val, 0 as sub_nr from dual  
union all  
select '6763' as nr, 'B' as sub_val, 0 as sub_nr from dual  
union all  
select '6763' as nr, 'B' as sub_val, 0 as sub_nr from dual  
union all  
select '6763' as nr, 'B' as sub_val, 0 as sub_nr from dual  
union all  
select '6763' as nr, 'B' as sub_val, 0 as sub_nr from dual  
union all  
select '6763' as nr, 'B' as sub_val, 0 as sub_nr from dual  
union all  
select '6835' as nr, 'B' as sub_val, 0 as sub_nr from dual  
union all  
select '6835' as nr, 'B' as sub_val, 1 as sub_nr from dual  
union all  
select '6835' as nr, 'B' as sub_val, 1 as sub_nr from dual  
union all  
select '6835' as nr, 'B' as sub_val, 0 as sub_nr from dual  
union all  
select '6835' as nr, 'B' as sub_val, 0 as sub_nr from dual  
union all  
select '8904' as nr, 'B' as sub_val, 0 as sub_nr from dual  
union all  
select '8904' as nr, 'B' as sub_val, 0 as sub_nr from dual  
union all  
select '8904' as nr, 'B' as sub_val, 0 as sub_nr from dual  
union all  
select '8904' as nr, 'C' as sub_val, 1 as sub_nr from dual  
union all  
select '8904' as nr, 'C' as sub_val, 0 as sub_nr from dual  
union all  
select '8904' as nr, 'C' as sub_val, 0 as sub_nr from dual  
union all  
select '8904' as nr, 'C' as sub_val, 1 as sub_nr from dual  
union all  
select '8904' as nr, 'C' as sub_val, 0 as sub_nr from dual  
union all  
select '8904' as nr, 'A' as sub_val, 0 as sub_nr from dual  
union all  
select '8904' as nr, 'A' as sub_val, 0 as sub_nr from dual  
union all  
select '8904' as nr, 'A' as sub_val, 0 as sub_nr from dual  
union all  
select '8904' as nr, 'A' as sub_val, 0 as sub_nr from dual  
union all  
select '8904' as nr, 'A' as sub_val, 0 as sub_nr from dual  
union all  
select '8904' as nr, 'A' as sub_val, 0 as sub_nr from dual  
union all  
select '8904' as nr, 'A' as sub_val, 0 as sub_nr from dual  
union all  
select '8904' as nr, 'D' as sub_val, 0 as sub_nr from dual  
union all  
select '8905' as nr, 'B' as sub_val, 1 as sub_nr from dual  
union all  
select '8905' as nr, 'B' as sub_val, 0 as sub_nr from dual  
union all  
select '8905' as nr, 'C' as sub_val, 0 as sub_nr from dual    
union all  
select '8905' as nr, 'A' as sub_val, 0 as sub_nr from dual  
union all  
select '8905' as nr, 'A' as sub_val, 0 as sub_nr from dual  
union all  
select '8905' as nr, 'A' as sub_val, 0 as sub_nr from dual  
union all  
select '8905' as nr, 'A' as sub_val, 0 as sub_nr from dual  
union all  
select '8905' as nr, 'A' as sub_val, 0 as sub_nr from dual  
union all  
select '8905' as nr, 'A' as sub_val, 0 as sub_nr from dual  
union all  
select '8905' as nr, 'A' as sub_val, 0 as sub_nr from dual  
union all  
select '8905' as nr, 'D' as sub_val, 0 as sub_nr from dual)  
select nr, sub_val, sub_nr, count(sub_val) as cnt
, case when sub_val = 'A' then 0 when sum(count(sub_val)) over(partition by nr) >= 5 then count(sub_val) else 0 end as MoreThan5
, case when sub_val = 'A' then count(sub_val) when sum(count(sub_val)) over(partition by nr) < 5 then count(sub_val) else 0 end as LessThan5
from helptab 
group by nr, sub_val, sub_nr
order by nr, sub_val, sub_nr

它应该如何工作:
sub_val等于'A'的每一行必须在LessThan5列上产生结果。所有其他需要通过nr和Sub_val之和(“A”除外)进行检查。当小于5时,所有结果也必须放在LessThan5列上,否则放在MoreThan5上。我认为sum()over(Partition by)是正确的方法,但它无法正常工作。

1 个答案:

答案 0 :(得分:1)

如果我理解了所有内容,则需要进行两项小修改:

if(s.name=="kolkata")  
相关问题