2016-03-29 15 views
0

私は輸送データの行を見ていて、同じモードの輸送として 'Uber Pool'と 'UberPool'のエントリのデータを操作できるようにしたい。2つの異なるスペルを1つにグループ化する方法

私の関数が2つの異なるスペルのすべてのテーブルエントリを出力テーブルの1つの行に集めるようにするにはどうすればよいですか?

+0

複雑で、言語に固有の問題があります。 upper/lower/soundexなどを試してみてください。 – jarlh

+2

異なるスペルがあらかじめわかっている場合は、異なる値を同じものとして扱うケースエクスプレッションを使用するか、異なる値が多い場合はマッピングテーブルを設定します。動的にする必要がある場合、問題はもっと難しくなります。 – jpw

+0

2つのエントリが等しいとみなされるルールを定義します。 'UberPool' = 'uBERpOOL'ですか? 'Uber Pool' = 'U-b-e-r * P-o-o-l'ですか? 'UberPool' = 'OoberPool'ですか? –

答えて

1

@jpwが言ったように、それはあなたのデータに依存するが、それのルックスで、あなたのGROUP BY句でCASE EXPRESSIONを使用してそれを行うことができます:あなたは、あなたのRDBMSにタグを付けていなかった

SELECT CASE t.name = 'Uber Pool' then 'UberPool' else t.name end as name,count(*) 
FROM YourTable t 
GROUP BY CASE t.name = 'Uber Pool' then 'UberPool' else t.name end 

が、一部ではそれらのうち、グループ内の選択項目から列エイリアスを指定して、よりよく見えるようにすることができます。

SELECT CASE t.name = 'Uber Pool' then 'UberPool' else t.name end as new_name,count(*) 
FROM YourTable t 
GROUP BY new_name 
1

これはコメントには長すぎます。

あなたはこのような何かをすることによって、スペースを削除し、文字列の大文字と小文字を標準化することができます。

select min(t.name) as name, . . . 
from t 
group by lower(replace(t.name, ' ', '')) 

これは、最初の列と一致する名前の一つ取り出します。 caseの束を列挙するよりも、これを使うほうが簡単です。

関連する問題