2017-02-02 9 views
0

Предположим, у меня нет удобной таблицы «Животные». Как так:SQL Count аналогичные записи

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 

И я хочу, чтобы подсчитать сколько подобных слов в таблице, которая начинается так же, но может закончиться по-другому. Также я бы хотел показать только имена без дополнительных «2» или «3». Чтобы быть более точным, я хочу такой результат:

Counted NAME 
4  Dog 
2  Cat 
1  Fish 

А вот код, который я пытался ладить с (перепробовал много способов):

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

Какие базы данных вы используете? – GurV

+0

Microsoft SQL SERVER MANAGEMENT STUDIO – user240179

+0

Вы должны определить категорию животных в отдельной таблице, это никогда не сработает –

ответ

1

утомительно, но простой способ лишить данных от цифровых символов:

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

Вы должны определить животных категории в отдельной таблице это никогда не сработает. Группировка будет очень сложной с различной орфографией для того же животного.

Если это всегда цифры в конце животных называют то

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 Хорошо, но скажем, что нет цифр: «собака», «собачка» «собачка». Как вы это сделаете? Без создания #temp-таблиц? .. – user240179

+2

@ user240179 Вы не можете. Это невероятно сложная манипуляция данными. – iamdave

+0

@ user240179 - Я буду писать собаку как dag теперь, как вы классифицируете? Поскольку у меня, как было сказано ранее, есть отдельная таблица для списка животных и ссылка на «ID» в вашей текущей таблице будет намного проще. –

0

Это позволит удалить все номера из данные, независимо от того, сколько их там или где они находятся. Это немного смешно, но потом иногда SQL просто ...

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; 

Выход:

+---------+------+ 
| 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