2011-01-14 14 views
15

2つの別々のカラムに分割されたローをカウントするSQLクエリを作成する際に助けが必要です。postgreSQLクエリ - 2つのカラムで一致するカラム値をカウントする

これは私のテーブルのDDLです:テーブルから

CREATE TABLE Agency (
    id SERIAL not null, 
    city VARCHAR(200) not null, 
    PRIMARY KEY(id) 
); 
CREATE TABLE Customer (
    id SERIAL not null, 
    fullname VARCHAR(200) not null, 
    status VARCHAR(15) not null CHECK(status IN ('new','regular','gold')), 
    agencyID INTEGER not null REFERENCES Agency(id), 
    PRIMARY KEY(id) 
); 

サンプルデータ

AGENCY 
id|'city' 
1 |'London' 
2 |'Moscow' 
3 |'Beijing' 

CUSTOMER 
id|'fullname'  |'status' |agencyid 
1 |'Michael Smith' |'new' |1 
2 |'John Doe'  |'regular'|1 
3 |'Vlad Atanasov' |'new' |2 
4 |'Vasili Karasev'|'regular'|2 
5 |'Elena Miskova' |'gold' |2 
6 |'Kim Yin Lu' |'new' |3 
7 |'Hu Jintao'  |'regular'|3 
8 |'Wen Jiabao' |'regular'|3 

私は都市によって新規顧客、常連客とgold_customersをカウントします。

( '新規'、 '通常'、 '金')は別に計算する必要があります。ここに私が欲しい出力があります:

'city' |new_customers|regular_customers|gold_customers 
'Moscow' |1   |1    |1 
'Beijing'|1   |2    |0 
'London' |1   |1    |0 
+1

の可能重複[T-SQL:?それは(カウントで条件を指定することが可能です)] (http://stackoverflow.com/questions/1400078/t-sql-is-it-possible-to-specify-condition-in-count) – Guffa

+5

+1のSQL DDL :) – onedaywhen

答えて

18

私は同じ数週間前に苦労していました。
これは必要なものです。

SELECT 
    Agency.city, 
    count(case when Customer.status = 'new' then 1 else null end) as New_Customers, 
    count(case when Customer.status = 'regular' then 1 else null end) as Regular_Customers, 
    count(case when Customer.status = 'gold' then 1 else null end) as Gold_Customers 
FROM 
    Agency, Customer 
WHERE 
    Agency.id = Customer.agencyID 
GROUP BY 
    Agency.city; 
+0

ありがとう!うまく動作します – openV

6

あなたは可能性があり、その後cityのグループ、および各都市でステータスの数を合計:

select city 
,  sum(case when c.status = 'new' then 1 end) as New 
,  sum(case when c.status = 'regular' then 1 end) as Regular 
,  sum(case when c.status = 'gold' then 1 end) as Gold 
from customer c 
join agency a 
on  c.agencyid = a.id 
group by 
     a.city 
+1

おかげでAndomar、それはうまく動作しますが、私に金のゼロを与えていません。あなたたちは速いです – openV

+0

ゲームに少し遅れていますが、おそらくゼロの差は合計対カウントによるものです(1対何も返さないために偽の等価性が得られます)? –

関連する問題