1

私は sql server 2008 を使用しており、単一の sql テーブルから全体的な結果を表示するためのクエリを作成しようとしています。各日付の count(fieldname) を表示したい、たとえば、各日付のテーブルで「izla」という名前が繰り返される頻度を知りたいのですが、「IZLA」または「Izla」でもある可能性があるため、見つける必要がありますこのデータを 1 つにグループ化し、そのうちの 3 つのカウントを見つける方法。

問題は、大文字または小文字を使用して自動的に同じと見なされるようにしようとすると、問題が発生することです。izla を大文字に変換すると İZLA になり、IZLA を小文字に変換すると ızla と表示されます。

大きな問題は、このデータをグループ化するにはどうすればよいかということです。問題は nvarchar の使用に起因する可能性がありますが、列の型をそのようにする必要があります (変更できません)。

4

3 に答える 3

2

グループ化するときは、Accent Insensitive 照合を使用する必要があります。これを group by 句に直接追加できます。次に例を示します。

Declare @Temp Table(Data nvarchar(100))

Insert Into @Temp Values(N'izla')
Insert Into @Temp Values(N'İZLA')
Insert Into @Temp Values(N'IZLA')
Insert Into @Temp Values(N'Izla')

Select  Data, 
        Count(*) 
From    @Temp 
Group By Data

Select  Data Collate Latin1_General_CI_AI, 
        Count(*) 
From    @Temp 
Group By Data Collate Latin1_General_CI_AI

この例を実行すると、最初のクエリが 2 つの行 (カウント 3 とカウント 1) を作成することがわかります。2 番目の例では、グループ化にアクセントを区別しない照合を使用しているため、4 つの項目すべてがグループ化されます。

私の例では、 Latin1_General_CI_AIを使用しました。使用している列の照合を調べてから、最後の AS を AI に変更して、最も一致する照合を使用することをお勧めします。

于 2009-08-05T13:41:43.477 に答える
0

これはすべて、システムが文字列データをソートする方法である照合に帰着します。

次のように言えます。

SELECT *, COUNT(*) OVER (PARTITION BY fieldname COLLATE Latin1_General_CI_AI), COUNT(*) OVER (PARTITION BY fieldname COLLATE Latin1_General_CI_AS)
FROM yourtable

これにより、各名前がさまざまな形式で何回出現したかについて、適切な数値が得られます。多くの照合順序があり、Books Online で完全なリストを検索できます。たとえば、Latin1_General_BIN にも興味があるかもしれません。

ロブ

于 2009-08-05T13:53:10.857 に答える
0

小文字化した後、ıなどを英語の同等のものに置き換えてみてください

于 2009-08-05T13:29:37.317 に答える