Mysql 对包含字符串的记录进行分组
我有一个包含以下数据的表:Mysql 对包含字符串的记录进行分组,mysql,sql,group-by,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 | +----+-----
+----+-----------------+
| 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 | population |
+---------+------------+
| usa | 2 |
| italy | 1 |
| china | 2 |
| india | 1 |
+---------+------------+
我想我应该使用GROUPBY和COUNT函数。但是怎么做呢?
谢谢。未经测试,但可能是解决方案
select SUBSTRING(country,(INSTR(country,'from') +5)), count(1)
from table group by SUBSTRING(country,(INSTR(country,'from') +5))
未测试,但可能是解决方案
select SUBSTRING(country,(INSTR(country,'from') +5)), count(1)
from table group by SUBSTRING(country,(INSTR(country,'from') +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;
如果国家可以在字符串中的任何地方,你可以找到它,假设它是在起点、末端或中间被空间包围。
如果国家总是在最后,你可以用这个
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;
如果国家可以在字符串中的任何地方,你可以找到它,假设它是在起点、末端或中间被空间包围。
假设国家名称始终是由空格分隔的国家/地区的最后一个组件,则可以执行以下操作:
select substring_index(country, ' ', -1) as real_country, count(*)
from your_table
group by real_country
提供国家/地区的最后一个单词。假设国家/地区名称始终是国家/地区的最后一个组成部分,其中的组成部分由空格分隔,则可以执行以下操作:
select substring_index(country, ' ', -1) as real_country, count(*)
from your_table
group by real_country
这会告诉你国家的最后一个字。也许这是有效的:
SELECT PARSENAME(REPLACE(country, ' ', '.'), 1) as parsedCountry, count(*) AS population
FROM table
GROUP BY parsedCountry
说明:
1.
替换国家/地区,“,”
只是用一个点替换所有的空间眼影。所以她是从美国来的,她是从美国来的
二,。
他来自美国,1岁
将在点上拆分字符串。然后从后到前数一,得到那部分字符串。将返回美国
三,。
从桌子上
我不知道你们桌子的名字…所以我把桌子放在桌子上
四,。
按解析的国家分组
它将在名称替换国家事件后进行分组。也许这样可以:
SELECT PARSENAME(REPLACE(country, ' ', '.'), 1) as parsedCountry, count(*) AS population
FROM table
GROUP BY parsedCountry
说明:
1.
替换国家/地区,“,”
只是用一个点替换所有的空间眼影。所以她是从美国来的,她是从美国来的
二,。
他来自美国,1岁
将在点上拆分字符串。然后从后到前数一,得到那部分字符串。将返回美国
三,。
从桌子上
我不知道你们桌子的名字…所以我把桌子放在桌子上
四,。
按解析的国家分组
它将在parsename替换country Occurrences后进行分组。如果您的“国家”名称可以来自另一个表,则这里有一个选项。这具有随“国家”名称列表的增长而增长的灵活性,无需进入并编辑SQL语句 我创建了一个临时表来匹配您的示例输入:
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来保存select的国家名称
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将如下所示。请注意类似“%”的内容
因为我只是随便玩玩,后来我把临时桌子扔了
drop table #countries
drop table #citizens
这里有一个选项,如果您的“国家”名称可以来自另一个表。这具有随“国家”名称列表的增长而增长的灵活性,无需进入并编辑SQL语句 我创建了一个临时表来匹配您的示例输入:
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来保存select的国家名称
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将如下所示。请注意类似“%”的内容
因为我只是随便玩玩,后来我把临时桌子扔了
drop table #countries
drop table #citizens
谢谢,但是你能解释一下吗?这里的“+5”是什么意思?如果国家名称在字符串中不在这个位置,例如在长文本中它在起始位置或位置50,它能找到它吗?instr函数找到文本位置。在本文中,它查找“from”文本,并返回第一次出现的文本。我来自美国,例如,它返回5。为了访问美国索引,我们必须为“from”文本字符添加5。我假设国家名称总是在“from”文本后面。谢谢,但你能解释一下吗?这里的“+5”是什么意思?如果国家名称在字符串中不在这个位置,例如在长文本中它在起始位置或位置50,它能找到它吗?instr函数找到文本位置。在本文中,它查找“from”文本,并返回第一次出现的文本。我来自美国,例如,它返回5。为了访问美国索引,我们必须为“from”文本字符添加5。我假设国家名称总是在“from”文本之后