2011-01-14 33 views
15

Tôi cần trợ giúp tạo truy vấn SQL để đếm các hàng được chia nhỏ trên hai cột riêng biệt.Truy vấn postgreSQL - Đếm số giá trị cột phù hợp trên hai cột

Đây là DDL cho Bàn của tôi:

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) 
); 

mẫu dữ liệu từ các bảng

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 

tôi muốn đếm các khách hàng mới, khách hàng thường xuyên và gold_customers theo thành phố.

Tôi cần được tính riêng cho ('mới', 'thông thường', 'vàng'). Đây là kết quả tôi muốn:

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

thể trùng lặp của [T-SQL: là nó có thể để xác định tình trạng Count()?] (http://stackoverflow.com/questions/1400078/t-sql-is-it-possible-to-specify-condition-in-count) – Guffa

+5

+1 cho SQL DDL :) – onedaywhen

Trả lời

18

Tôi đã vật lộn với cùng một vài tuần trước.
Đây là những gì bạn cần.

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

Cảm ơn người đàn ông! hoạt động tốt – openV

6

Bạn có thể nhóm trên city, và sau đó tổng số các trạng thái tại mỗi thành phố:

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

Cảm ơn Andomar, nó hoạt động tốt nhưng không cho tôi số không vàng. Các bạn nhanh chóng – openV

+0

Một chút muộn cho trò chơi nhưng có lẽ sự khác biệt trong số không là do tổng số vs (mà đạt được một tương đương sai do ra trở về 1 vs không có gì)? –

Các vấn đề liên quan