包含字符串的组记录

时间:2012-04-14 21:06:04

标签: mysql sql group-by

我有一张包含以下数据的表格:

+----+-----------------+
| 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 BYCOUNT()功能。但是怎么样? 感谢。

5 个答案:

答案 0 :(得分:5)

如果国家总是在最后,你可以使用它。

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

答案 1 :(得分:4)

假设国家/地区名称始终是country的最后一个组件(其中组件由空格分隔),那么您可以这样做:

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

substring_index(country, ' ', -1)为您提供了国家的最后一个“字”。

答案 2 :(得分:1)

未经测试但可能是解决方案

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

答案 3 :(得分:0)

也许这有效:

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

说明: 1。     REPLACE(国家,'','。') 只需用点替换所有空间事件即可。所以“她来自美国”将是“她的。来自于”。

2。     PARSENAME(“she's.from.usa”,1) 将点上的字符串分开。然后从后到前计数1并获得字符串的那一部分。将返回“美国”

3。     从表 我不知道你桌子的名字是什么......所以我放了桌子。

4。     GROUP BY parsedCountry 它会将after-parsename-replace-country事件分组。

答案 4 :(得分: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