我有一张包含以下数据的表格:
+----+-----------------+
| 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()
功能。但是怎么样?
感谢。
答案 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