2012-05-26 10 views
6

Actualmente cuando emito este SQL, obtiene el nombre de usuario distinto.Cómo agrupar con una condición especial

Tengo algunos nombres de usuario distintos, que representan grupos, por ejemplo GRP_BSN.

me gustaría grupo todos los otros nombres de usuario (que pasa a ser numérico) en un grupo, por ejemplo, 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 

puedo lograr algo como esto:

GRP_OTHERS 20 
GRP_BSN 226 
GRP_ASN 243 
GRP_DSC 93 

EDIT: Modificado pregunta de respuesta

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

me preguntaba si teníamos 'GROUP bY (concate (col1 col2 Y))' –

Respuesta

11

@bfavaretto es agradable (1 a él), pero si usted no sabe acerca de username prefijo o que son diferentes se puede ir con algo como:

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

Sí, ¡eso es definitivamente más flexible que el mío! – bfavaretto

+0

@zerkms i parecen golpear ORA-00920: no válido operador relacional>< –

+0

@Chin Boon: la parte de consulta de mi respuesta no puede causar eso. Será mejor que muestres tu consulta completa (en tu pregunta) – zerkms

3

No es muy eficiente, pero debería funcionar:

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, ¿qué? – zerkms

+0

¡Idea creativa! Me gusta – TGH

2

Si quisiera hacerlo, poniendo pequeños grupos en un cubo, en lugar de por un patrón de nombre en particular, que puede usar:

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)