2017-02-02 5 views
0

Sagen wir, ich habe keine benutzerfreundliche Tabelle namens Animals. Wie so:SQL Count ähnliche Datensätze

ID NAME CHANGED 
1 Dog 2016-01-02 
2 Dog 2016-01-05 
3 Dog2 2016-01-05 
4 Dog3 2016-01-06 
5 Cat 2016-01-06 
6 Fish 2016-01-07 
7 Cat2 2016-01-07 

Und ich möchte, wie viele ähnliche Wörter in der Tabelle sind zählen, die die gleiche Art und Weise beginnt könnte aber anders enden. Außerdem möchte ich nur Namen ohne zusätzliche '2' oder '3' anzeigen. Um genauer zu sein ich ein solches Ergebnis wollen:

Counted NAME 
4  Dog 
2  Cat 
1  Fish 

Und hier ist der Code Ich habe versucht, mit auszukommen (haben viele Möglichkeiten ausprobiert):

SELECT COUNT(
CASE 
    WHEN NAME LIKE '%' + NAME + '%' THEN 1 
     ELSE 0 
END 
) AS Counted, NAME FROM Animals 
WHERE NAME LIKE '%' + NAME + '%' AND 
    NAME NOT LIKE '%2' AND 
    NAME NOT LIKE '%3' 
    GROUP BY NAME 
    ORDER BY Counted DESC 
+1

Welche Datenbank verwenden Sie? – GurV

+0

Microsoft SQL SERVER MANAGEMENT STUDIO – user240179

+0

Sie müssen die Tiere Kategorie in separaten Tabelle definieren dies wird nie funktionieren –

Antwort

1

Tedious aber einfache Methode ist, Ihre Daten aus numerischen Zeichen abzustreifen:

select new_name, 
     count(*) as counted 
from (
     select replace(replace(replace....replace(Name, '0', ''), '1', ''), '2','')... as new_name 
     from Animals 
     ) as a 
group by new_name 
0

Sie müssen die Tiere definieren Kategorie in separaten Tabelle wird dies nie funktionieren. Gruppierung wird sehr schwierig sein mit unterschiedlicher Schreibweise für dasselbe Tier.

Wenn es immer Zahlen am Ende der Tiere nennen dann

select left(Name,isnull(nullif(patindex('%[0-9]%',Name)-1,-1),len(Name))),count(1) 
From yourtable 
Group by left(Name,isnull(nullif(patindex('%[0-9]%',Name)-1,-1),len(Name))) 
+0

@Prdp Ok, aber sagen wir, es gibt keine Zahlen: 'Hund', 'Dogg' 'Doggee' Wie würdest du es dann tun? Ohne #temp-Tabellen zu erstellen? .. – user240179

+2

@ user240179 Sie können nicht. Das ist eine unglaublich komplexe Datenmanipulation. – iamdave

+0

@ user240179 - Ich werde Hund als dag jetzt schreiben, wie wirst du kategorisieren? Wie ich schon früher gesagt habe eine separate Tabelle für Tiere Liste und verweisen Sie die "ID" in Ihrem aktuellen Tischleben wird so viel einfacher –

0

Dadurch werden alle Zahlen entfernen von Ihrem Daten, unabhängig davon, wie viele Daten in Ihren Daten enthalten sind oder wo sie sich befinden. Es ist ein bisschen lächerlich, aber dann manchmal SQL gerade ist ...

declare @t table(ID int, Name nvarchar(10), Changed date); 
insert into @t values 
(1 ,'Dog','20160102') 
,(2 ,'Dog','20160105') 
,(3 ,'Dog2','20160105') 
,(4 ,'Dog30','20160106') 
,(5 ,'Cat','20160106') 
,(6 ,'Fish','20160107') 
,(7 ,'Cat27676','20160107'); 

select count(1) as Counted 
     ,replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(Name 
      , '0', ''),'1', ''),'2', ''),'3', ''),'4', ''),'5', ''),'6', ''),'7', ''),'8', ''),'9', '') as Name 
from @t 
group by replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(Name 
      , '0', ''),'1', ''),'2', ''),'3', ''),'4', ''),'5', ''),'6', ''),'7', ''),'8', ''),'9', '') 
order by Counted desc; 

Ausgang:

+---------+------+ 
| Counted | Name | 
+---------+------+ 
|  4 | Dog | 
|  2 | Cat | 
|  1 | Fish | 
+---------+------+ 
1
select case when patIndex('%[0-9]', val) = 0 then val 
    else substring(val, 1, patIndex('%[0-9]', val)-1) end, count(*) 
from table 
Group by case when patIndex('%[0-9]', val) = 0 then val 
    else substring(val, 1, patIndex('%[0-9]', val)-1) end