2010-12-12 75 views
1

J'ai une table:Groupe par sur la base des conditions

spent totalsent totalused 
---------------------------- 
4  1234  123 
6  12   4 
7  45   32 

Je dois groupe totalused/totalsent en groupes de 0 < = passé < = 5, 6 < = passé < = 10 et ainsi de suite .

Comment cela peut-il être fait?

+0

Merci poneys. +1 – EvilTeach

+0

Je veux juste grouper par sur la base de conditions sur un attribut. Ici, c'est (totalsent/totalused) groupés par passé en groupes de 0-5, 6-10, 11-15 –

Répondre

2

Si vous êtes désireux groupes de 5, vous pouvez probablement mettre en place une colonne de groupe sur lequel se divise par 5.

with my_source_data as (
    select 4 as spent, 1234 as totalsent, 123 as totalused from dual union all 
    select 6 as spent, 12 as totalsent, 4 as totalused from dual union all 
    select 7 as spent, 45 as totalsent, 32 as totalused from dual 
) 
select 
    (spent_group -1) * 5 + 1 as lower_bound, 
    spent_group * 5 as upper_bound, totalsent, totalused 
from (
    select 
    greatest(ceil(spent/5),1) as spent_group, 
    sum(totalsent) as totalsent, sum(totalused) totalused 
    from my_source_data 
    group by greatest(ceil(spent/5),1) 
) 

Ce code ne gère pas tout à fait 0 ou quoi que ce soit en dessous de 0 correctement depuis il met tout dans le groupe inférieur et l'étiquette 1-5, mais vos exigences sont un peu vagues à cet égard.

De plus, il s'agit d'un regroupement parcimonieux, il n'y aura donc qu'une ligne pour 11-15 s'il y a des données source qui permettent de le produire.