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

1つのバケットに小グループ、代わりに特定の名前のパターンによって、あなたが使用できます。

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) 
関連する問題