投稿されている内容はあまり信用できません...
クエリは をスローする必要がありますORA-00979: Not a GROUP BY expression
。これは、分析関数に含まれていない列、つまりusername
に反映されていないためgroup by
です。
ORA-00920 は、次のいずれかが欠けていることを意味します:=, <>, not in, in, !=, is not null, is null, not like, like
など。正しいクエリを投稿したことを確認しますか?
11.2 では、次のようにテーブルに近いものを作成します。
create table host
( username varchar2(100)
, created_dt date );
insert into host
select level, sysdate - level
from dual
connect by level <= 10
;
insert into host
select chr(ascii(level) + 32), sysdate - level
from dual
connect by level <= 10
;
commit ;
次にクエリを実行すると、結果がORA-00979に投稿されました。これを次のように変更しても問題ありません。
select case when regexp_like(username, '^\d+$') then 'GRP_OTHERS'
else username end as username
, count(*)
from host
where created_dt 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
;
これは、次のように書き直すこともできます。
select distinct username
, count(*) over ( partition by case when regexp_like(username, '^\d+$')
then 'GRP_OTHERS'
else username end )
from host
where created_dt 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')
この2番目のクエリは、あなたが望むものに似ていると思います. 実際のユーザー名を返しますが、数字だけのすべてのユーザー名をグループ化します。代わりに表示したい場合は、ケースによって返されたユーザー名の列を置き換えるだけですGRP_OTHERS
。
必ずしも言語間で一貫性があるとは限らないため、Oracle でフォーマット モデルを使用しないmon
方が少し良いです。mm
代わりに使用してください。
9i を使用しているため、代わりに翻訳を使用できます。正規表現を次のように置き換えます。
trim(translate(username,'0123456789',' ')) is null
これは数字を何も置き換えず、何か残っているかどうかを確認します...