2016-07-30 4 views
0

レッツを最小値、最大値と平均値を見つけるには、私がデータ分割列とOracleのクエリで

Name  Fee 
Student1 Fee paid : 100rs 
Student2 Fee paid : 500rs 
Student3 Fee paid : 200rs 

の下に持って考える私は最大、最小、最大分割する必要が手数料列の平均値を選択する必要があります:とRSここ​​では例のために

区切り 結果は

Min  Max  Avg 
100  500  250 
+0

この質問には*名前*列は何がありますか? – trincot

+2

将来、このようなデータは実際には保存しないでください。数値データを独自の数値列に格納します。カラムから意味のあるものを得るために文字列を分割することは、実際には良い設計の決定ではありません。 – Kritner

答えて

2

あなたはそのために正規表現を使用することができます:

select min(fee_num), max(fee_num), avg(fee_num) 
from (
     select to_number(regexp_substr(fee, ':\s*(\d+)\s*rs', 1, 1, null, 1)) fee_num 
     from mytable 
    ) 

(Oracle 11gの以降で利用可能)regexp_substrの6 番目の引数には、キャプチャグループにマッチしたテキストのみを返すことができます(すなわち、この場合は\d+)。

正規表現は、その後、いくつかの数字(複数可)(\d+)、再びその次​​rsと、任意の空白が続くを有するように、任意に空白(\s*)が追従すべき:必要とします。

テキスト列から金額を取得すると、構造化されたデータベースから得られる利点はありません。その列の索引は使用されず、正規表現による抽出にはオーバーヘッドが伴います。

正規化されたリレーショナルデータベース設計では、フィールドには原子データのみが含まれます。この場合、fee列には金額のみが含まれ、数値データ型である必要があります。料金について知る必要があるその他の情報は、別の列に保管してください。

関連する問題