2009-08-05 9 views
1

Ich benutze SQL Server 2008 und ich versuche, eine Abfrage für die Anzeige einiger Gesamtergebnisse aus einer einzigen SQL-Tabelle zu erstellen. Ich möchte die Anzahl (Feldname) für jedes Datum anzeigen, zum Beispiel möchte ich wissen, wie oft der Name "izla" in der Tabelle für jedes Datum wiederholt wird, aber es könnte auch "IZLA" oder "Izla" sein, also muss ich Finde einen Weg, um diese Daten zu einer Gruppe zusammenzufassen und die drei zu finden.Sql versucht, Groß-/Kleinschreibung zu ändern und ähnliche Nvarchar-Werte zu gruppieren

Das Problem ist, dass, wenn ich versuche, Groß- oder Kleinbuchstaben zu verwenden, so dass sie automatisch gleich sind, habe ich das Problem: Wenn izla nach Upper konvertiert wird, wird es IZLA oder auf der anderen Seite, wenn IZLA in Kleinbuchstaben umgewandelt wird angezeigt ızla.

Die große Frage ist, wie kann ich diese Daten zusammenfassen? Vielleicht kommt das Problem von der Verwendung von nvarchar, aber ich brauche den Spaltentyp, um so zu sein (kann es nicht ändern).

Antwort

2

Kleinschreibung Wenn Sie Gruppe, sollten Sie eine Accent Unempfindlich Sortierung verwenden. Sie können dies direkt zu Ihrer group by-Klausel hinzufügen. Im Folgenden ist ein Beispiel:

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 

Wenn Sie dieses Beispiel ausführen, werden Sie sehen, dass die erste Abfrage erstellt zwei Reihen (mit Anzahl 3 und zählen 1). Das zweite Beispiel verwendet eine Sortierung für die Akzent-Insensitivität für die Gruppierung, sodass alle vier Elemente gruppiert sind. In meinem Beispiel Latin1_General_CI_AI. Ich schlage vor, dass Sie die Kollatierung der Spalte, die Sie verwenden, untersuchen und dann eine Kollation verwenden, die am ehesten übereinstimmt, indem Sie das AS am Ende von AI ändern.

+0

Danke! Es hilft sehr. – Blerta

+0

Meinst du nicht Case-Intensive-Sortierung? Oder fehlt mir etwas an Akzenten? – pjp

+0

@pjp, du hast Recht. Ich habe die Erklärung geändert. Danke, dass du darauf hingewiesen hast. –

0

ich versuchen, und solche mit Englisch gleichwertigen Ersatz nach

+0

Nun, ich bin Suche nach einem Weg, die das automatisch lösen könnte, weil es ein anderer Brief auseinander Form sein könnte „i“, so dass Sie nicht nur jede mögliche Situation aufschreiben kann. – Blerta

0

Dies alles kommt auf die Sortierung, das ist die Art, wie das System Zeichenfolge Daten sortiert.

Man könnte sagen, so etwas wie:

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

Dies wird für Sie ein paar schöne Zahlen geben um, wie oft jeder Name in den verschiedenen Formaten erschienen. Es gibt viele Sortierungen, und Sie können in der Onlinedokumentation nach einer vollständigen Liste suchen. Vielleicht interessieren Sie sich auch für Latin1_General_BIN.

Rob

Verwandte Themen