2012-05-26 16 views
6

Attualmente quando rilascio questo SQL, ottiene il nome utente distinto.Come raggruppare con una condizione speciale

Ho alcuni nomi utente distinti, che rappresentano gruppi, ad es. GRP_BSN.

Vorrei raggruppare tutti gli altri nomi utente (che capita di essere numerici) in un gruppo, ad es. GRP_OTHERS

select username, count(*) 
from host 
where seq between 0 and 2000 
group by username; 

63149 1 
63732 1 
64110 2 
70987 12 
76841 4 
GRP_BSN 226 
GRP_ASN 243 
GRP_DSC 93 

Posso realizzare qualcosa di simile:

GRP_OTHERS 20 
GRP_BSN 226 
GRP_ASN 243 
GRP_DSC 93 

EDIT: Modificato query dalla risposta

select username, count(*) 
from host 
    where created_dt 
    -- date selection 
    between to_date('2012-may-23 00:00:00', 'yyyy-mon-dd hh24:mi:ss') 
    and to_date('2012-may-23 23:59:59', 'yyyy-mon-dd hh24:mi:ss') 
GROUP BY CASE 
      WHEN REGEXP_LIKE(username, '^\d+$') THEN 'GRP_OTHERS' 
               ELSE username 
     END; 
+0

mi chiedevo se avevamo 'GROUP bY (concate (COL1 E COL2))' –

risposta

11

@bfavaretto è bello (+1 a lui), ma se non si conoscono username prefisso o che siete diversi si può andare con qualcosa di simile:

GROUP BY CASE 
      WHEN REGEXP_LIKE(username, '^\d+$') THEN 'GRP_OTHERS' 
               ELSE username 
     END 
+0

Sì, è decisamente più flessibile del mio! – bfavaretto

+0

@zerkms mi sembra di colpire ORA-00920: operatore relazionale non valido>< –

+0

@Chin Boon: la parte della query dalla mia risposta non può causare quello. Faresti meglio a mostrare la tua query completa (nella tua domanda) – zerkms

3

non molto efficiente, ma dovrebbe funzionare:

SELECT 
    CASE WHEN username LIKE 'GRP%' THEN username ELSE 'GRP_OTHERS' END AS username, 
    COUNT(*) 
FROM host 
WHERE seq BETWEEN 0 AND 2000 
GROUP BY CASE WHEN username LIKE 'GRP%' THEN username ELSE 'GRP_OTHERS' END; 
+0

@Glenn: uhm, che cosa? – zerkms

+0

Idea creativa! Mi piace – TGH

2

Se si voleva farlo mettendo piccoli gruppi in un secchio, invece che per un particolare modello di nome, è possibile utilizzare:

select (case when cnt > 100 then username else 'OTHER' end), sum(cnt) as cnt 
from (select username, count(*) as cnt 
     from host 
     where seq between 0 and 2000 
     group by username 
    ) t 
group by (case when cnt > 100 then username else 'OTHER' end) 
Problemi correlati