1

次のデータを含むテーブルがあります。

+----+-----------------+
| 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()機能する必要があると思います。しかし、どのように?ありがとう。

4

5 に答える 5

8

国が常に最後にある場合は、これを使用できます。

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
于 2012-04-14T21:18:33.180 に答える
4

国名が常にcountry(コンポーネントがスペースで区切られている) の最後のコンポーネントであると仮定すると、次のようにすることができます。

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

substring_index(country, ' ', -1)、国の最後の「単語」を提供します。

于 2012-04-14T21:20:51.633 に答える
1

テストされていませんが、解決策になる可能性があります

select SUBSTRING(country,(INSTR(country,'from') +5)), count(1) 
from table group by SUBSTRING(country,(INSTR(country,'from') +5))
于 2012-04-14T21:08:13.947 に答える
0

'country'名が別のテーブルから取得できる場合のオプションは次のとおりです。これには、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
于 2012-04-14T21:36:49.140 に答える
0

多分これはうまくいきます:

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

説明: 1. REPLACE(country, ' ', '.') すべてのスペースの出現をドットに置き換えるだけです。したがって、「she's from usa」は「she's.from.usa」になります。

2. PARSENAME("she's.from.usa", 1) 文字列をドットで分割します。次に、後ろから前に 1 を数えて、文字列のその部分を取得します。「米国」を返します

3. FROM テーブル テーブルの名前がわからないので、テーブルを置きます。

4. GROUP BY parsedCountry は、after-parsename-replace-country オカレンスをグループ化します。

于 2012-04-14T21:21:51.217 に答える