如何按特殊条件分组

时间:2012-05-26 01:51:08

标签: sql oracle group-by

目前,当我发出此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;

3 个答案:

答案 0 :(得分:10)

@bfavaretto很好(给他+1),但是如果你不知道username前缀或者它们不同,你可以选择以下内容:

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

答案 1 :(得分: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;

答案 2 :(得分: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)