2012-05-26 17 views
6

Obecnie, kiedy wydaje ten SQL, otrzymuje odrębną nazwę użytkownika.Jak grupować według specjalnego warunku

Mam kilka różnych nazw użytkowników, które reprezentują grupy, np. GRP_BSN.

Chciałbym zgrupować wszystkie inne nazwy użytkowników (które są numeryczne) w grupę np. 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 

mogę osiągnąć coś takiego:

GRP_OTHERS 20 
GRP_BSN 226 
GRP_ASN 243 
GRP_DSC 93 

EDIT: Zmodyfikowane zapytanie z odpowiedzią

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

zastanawiałem się, czy mieliśmy 'GROUP bY (CONCATE (COL1 I cOL2))' –

Odpowiedz

11

@bfavaretto jest ładny (+1 do niego), ale jeśli nie wiem o username prefiksu lub są one różne można iść z czymś takim:

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

Tak, to zdecydowanie bardziej elastyczne niż moje! – bfavaretto

+0

@zerkms wydaje mi się, że hit ORA-00920: nieprawidłowy operator relacyjny>< –

+0

@ Bohin Boon: część zapytania z mojej odpowiedzi nie może tego powodować. Lepiej pokaż swoje pełne zapytanie (w pytaniu). – zerkms

3

Nie bardzo skuteczny, ale powinno działać:

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, co? – zerkms

+0

Ciekawy pomysł! Podoba mi się – TGH

2

Jeśli chcesz to zrobić, umieszczając małe grupy w jednym wiadrze, zamiast według określonego wzorca nazwy, można użyć:

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) 
Powiązane problemy