2012-05-26 6 views
6

В настоящее время, когда я выдаю этот SQL, он получает отдельное имя пользователя.Как сгруппировать по специальному условию

У меня есть несколько разных имен пользователей, которые представляют группы, например. GRP_BSN.

Я хотел бы сгруппировать все другие имена пользователей (которые являются числовыми) в группу, например. 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 

Могу ли я достичь что-то вроде этого:

GRP_OTHERS 20 
GRP_BSN 226 
GRP_ASN 243 
GRP_DSC 93 

EDIT: Модифицированный запрос от ответа

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

мне было интересно, если бы мы имели 'GROUP BY (CONCATE (COL1 и col2))' –

ответ

11

@bfavaretto хорошо (+1 к нему), но если вы не знаете о username префикс или они разные вы можете пойти с чем-то вроде:

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

Да, это определенно более гибко, чем мое! – bfavaretto

+0

@zerkms Я, кажется, ударил ORA-00920: недействительный реляционный оператор>< –

+0

@Chin Boon: часть запроса из моего ответа не может вызвать этого. Вы лучше покажете свой полный запрос (в своем вопросе) – zerkms

3

не очень эффективно, но должно работать:

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: хмм, что? – zerkms

+0

Креативная идея! Мне нравится – TGH

2

Если вы хотите, чтобы сделать это, поместив малые группы в одно ведро, а не по определенному шаблону имен, вы можете использовать:

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) 
Смежные вопросы