2016-07-07 13 views
1

Ich habe ein Ranking-Skript, das gut funktioniert - während es die Top-30-Produkte, die Monat für Monat verkaufen, rangiert, aber in den letzten Monaten haben sich meine Daten ein wenig verändert. So ging der Produktname von:Gruppierung nach ähnlichen Zeichenfolgen - Transact SQL

product_name 

zu

[email protected] 

wo die @ irgendeine Art von Sonderzeichen ist. Beachten Sie, dass das Sonderzeichen nicht immer nur aus einem Zeichen besteht, manchmal ist zwischen dem Sonderzeichen und dem Namen ein Leerzeichen. Außerdem endet der Produktname nicht immer in einem Buchstaben, gelegentlich endet er in einer Zahl. Diese Kuriosität in den Daten scheint zufällig zu geschehen und zu verschiedenen Produktnamen. Ich habe über 50.000 Produkte in dieser Tabelle. Gibt es einen Weg, den ich noch nach Produkt gruppieren kann? Oder vielleicht das Sonderzeichen abschneiden?

+1

Sie würden am besten Ihre Daten sortieren. Falls nicht, schauen Sie sich die SOUNDEX Funktion an http://stackoverflow.com/questions/37744220/sql-similar-data-in-column/37745913#37745913 –

+0

Kann eines dieser Sonderzeichen im Produktnamen selbst vorkommen? Hast du eine vollständige Liste dieser Charaktere? –

+0

Es ist fast immer ein Copyright, TM oder reserviertes Symbol. Diese Symbole befinden sich gelegentlich innerhalb des Produktnamens selbst - waren aber historisch gesehen so vorhanden, dass sie keine Probleme verursachen. – windsormatic

Antwort

0

Wenn diese Symbole Hinter, werfen Sie einen Blick auf diese Lösung:

SELECT RTRIM(SUBSTRING(Name, 1, CASE WHEN PATINDEX('%[$#@]%', Name)!=0 THEN PATINDEX('%[$#@]%', Name)-1 ELSE LEN(Name) END)) Word, COUNT(*) Total 
FROM (VALUES 
    ('Cat $#@'), 
    ('Cat $'), 
    ('Dog'), 
    ('Dog$'), 
    ('Cat'), 
    ('Cat ')) T(Name) 
GROUP BY RTRIM(SUBSTRING(Name, 1, CASE WHEN PATINDEX('%[$#@]%', Name)!=0 THEN PATINDEX('%[$#@]%', Name)-1 ELSE LEN(Name) END)) 

Wörter geschnitten werden durch ein beliebiges Sonderzeichen in Klammern [$ # @] und RTrimmed unnötige Leerzeichen zu entfernen.