2016-08-15 10 views
-1

私は私自身も他の人たちと混同してしまったと思うので、元のリクエストを編集しています。私は大陸内で数え切れないほどの事件をしたい。混乱ケースステートメントでのカウント

ID, --a unique incident number 

case 
when trim(both ' ' from cs.country) in ('France','UK',Germany) then 'Europe' 
when trim(both ' ' from cs.country) in ('Argentina','Peru','Brazil') 
then 'SouthAmerica'  
when trim(both ' ' from cs.country) in ('Bangladesh,'India','China') 
then 'Asia'  
end as "Continent" 

これは、申し訳ありませんが、私が派生テーブルとしてあなたの元のクエリをラップ

 Continent  Total   
     Europe   15 
     Asia   12 
     Asia    9 
     SouthAmerica  5 

多くのおかげ

+0

あなたは「大陸での計算」と言います。バングラデシュとインドはどちらもアジアですが、数字は異なりますので、国ごとに数えますか? – jarlh

+0

申し訳ありませんが、重要な部分は省いています。事件が発生するたびに一意のIDを示す「事故」列があります。だから私は各大陸での事件の数を数えています – whitz11

+0

どうしてバングラデシュとインドの数字は違うのですか?同じ大陸... – jarlh

答えて

1

を見たいものです。列がある場合ので

select cs.country, 
     (case when trim(both ' ' from cs.country) in ('France', 'UK', Germany) 
      then 'Europe' 
      when trim(both ' ' from cs.country) in ('Argentina', 'Peru', 'Brazil') 
      then 'SouthAmerica'  
      when trim(both ' ' from cs.country) in ('Bangladesh', 'India', 'China') 
      then 'Asia'  
     end) as Continent, 
     count(*) 
from t 
group by country, continent; 

は、しかし、あなたは、注意する必要があります:あなたが行うことができますので

select Country, "Continent", count(*) 
from 
(
    select 
    cs.country, 
    case 
    when trim(both ' ' from cs.country) in ('France','UK',Germany) then 'Europe' 
    when trim(both ' ' from cs.country) in ('Argentina','Peru','Brazil') 
    then 'SouthAmerica'  
    when trim(both ' ' from cs.country) in ('Bangladesh,'India','China') 
    then 'Asia'  
    end as "Continent" 
    from tablename 
) 
group by Country, "Continent" 
3

Postgresは、あなたがgroup byで表の別名を使用することができます:それは結果GROUP BYですあなたのテーブルにcontinentと呼ばれるものがあれば、代わりにgroup byがそれを使用します。

また、大陸を参照する参照テーブルが必要です。このようなコードブロックは、時間の経過とともに新しいクエリにコピーされるため、メンテナンスの悪夢になりがちです。

+0

ゴードンはこれが私のためにPostgresに働いてくれてありがとう – whitz11

0

私は@GordonLinoffはあなたが本当にテーブルを望んで指摘したように、ここで私は値ステートメントを使用して、インラインテーブルを作るこの

ようにそれを行うだろう。次に、表をマテリアライズしたいときは、ほとんどの変更は必要ありません。

また、このような結合は、CASE文よりも高速に実行されます...多くのことに依存しますが、それは起こります。

select cs.country, coalesce(tmp.con, 'unknown') as continent, count(*) 
from t cs 
left join (
    values 
    ('France', 'Europe'), 
    ('UK', 'Europe'), 
    ('Germany', 'Europe'), 
    ('Argentina', 'SouthAmerica'), 
    ('Peru', 'SouthAmerica'), 
    ('Brazil', 'SouthAmerica'), 
    ('Bangladesh', 'Asia'), 
    ('India', 'Asia'), 
    ('China', 'Asia') 
) as tmp(cou,con) ON cou = trim(both ' ' from cs.country) 
groupby cs.country, coalesce(tmp.con, 'unknown') 
関連する問題