2012-04-14 6 views
0

У меня есть таблица с данными:записей группы, которые содержат строку

+----+-----------------+ 
| id | country   | 
+----+-----------------+ 
| 1 | i'm from usa | 
| 2 | i'm from italy | 
| 3 | i'm from china | 
| 4 | i'm from india | 
| 5 | she's from usa | 
| 6 | he's from china | 
+----+-----------------+ 

Я хочу знать, население каждой страны, проверяя название страны в country колонки. я хочу что-то вроде этого:

+---------+------------+ 
| country | population | 
+---------+------------+ 
| usa  | 2   | 
| italy | 1   | 
| china | 2   | 
| india | 1   | 
+---------+------------+ 

Я думаю, что я должен использовать GROUP BY и COUNT() функцию. Но как? Спасибо.

ответ

1

Не тестировался, но может быть решением

select SUBSTRING(country,(INSTR(country,'from') +5)), count(1) 
from table group by SUBSTRING(country,(INSTR(country,'from') +5)) 
+0

спасибо, но можете ли вы это объяснить? что означает «+5»? и если название страны не было в этом положении (в строке), например, оно было в начале или в позиции 50 (в длинном тексте), может ли оно найти его? – mrdaliri

+0

Функция instr находит текстовое положение. в этом сообщении он ищет «из» текста и возвращает первое вхождение. Я из примера america, он возвращает 5. для доступа к индексу америки, мы должны добавить 5 для 'from' text char. – hkutluay

+0

Я предполагаю, что названия стран всегда появляются после текста «из» – hkutluay

4

Если страна всегда в конце концов, вы можете использовать это.

select 
    case 
    when country like '%usa' then 'usa' 
    when country like '%italy' then 'italy' 
    when country like '%china' then 'china' 
    when country like '%india' then 'india' 
    end as ccountry, 
    count(*) as population 
from Table1 
group by ccountry; 

Если страна может быть в любом месте строки вы можете найти его, как это при условии, что в самом начале, в конце или в середине, в окружении space.

select 
    case 
    when country like '% usa %' then 'usa' 
    when country like '% italy %' then 'italy' 
    when country like '% china %' then 'china' 
    when country like '% india %' then 'india' 
    end as ccountry, 
    count(*) as population 
from 
    (
     select concat(' ', country, ' ') as country 
     from Table1 
    ) T 
group by ccountry 
4

Если предположить, что название страны всегда является последним компонентом country (где компоненты разделяются пробелами), то вы можете сделать это:

select substring_index(country, ' ', -1) as real_country, count(*) 
from your_table 
group by real_country 

substring_index(country, ' ', -1) дает последнее «слово» страны.

0

Может быть, это работает:

SELECT PARSENAME(REPLACE(country, ' ', '.'), 1) as parsedCountry, count(*) AS population 
FROM table 
GROUP BY parsedCountry 

Объяснение: 1. ЗАМЕНА Просто заменяет все пространство вхождения с точкой (страны, '', ''.). Так что "она из США" будет "she's.from.usa"

2. ParseName ("she's.from.usa", 1) будет разделить строку на точки. А затем пересчитайте 1 назад назад и получите ту часть строки. Вернет «usa»

3. FROM table Я не знаю, как зовут ваш стол ... Поэтому я поставил стол.

4. ГРУППА BY parsedCountry его группа собирает последствия после-parsename-replace-country.

0

Вот вариант, если ваше название страны может быть получено из другой таблицы. У этого есть гибкость, чтобы расти по мере роста списка имен вашей страны, без необходимости входить и редактировать SQL-запросы.

Я создал временную #citizens таблицы, чтобы соответствовать вашему Примеру ввода:

create table #citizens (id int, country varchar(30)) 

insert into #citizens (id, country) values (1, 'i''m from usa') 
insert into #citizens (id, country) values (2, 'i''m from italy') 
insert into #citizens (id, country) values (3, 'i''m from china') 
insert into #citizens (id, country) values (4, 'i''m from india') 
insert into #citizens (id, country) values (5, 'she''s from usa') 
insert into #citizens (id, country) values (6, 'he''s from china') 

Затем я создал временную #countries таблицы для хранения названий стран для выбора

create table #countries (country varchar(30)) 

insert into #countries values('usa') 
insert into #countries values('china') 
insert into #countries values('india') 
insert into #countries values('italy') 

Требуемых выбор будет выглядеть так. Обратите внимание, что нравится «%» ...

select co.country, COUNT(*) 
from #countries co 
left outer join #citizens ci on ci.country like '%'+co.country+'%' 
group by co.country 

С тех пор, как я просто играл, я потом бросил временные таблицы.

drop table #countries 
drop table #citizens 
Смежные вопросы