2012-05-26 31 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 

編輯:從答案

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)