2011-01-14 15 views
15

Potrzebuję pomocy w tworzeniu zapytania SQL w celu zliczenia wierszy podzielonych na dwie oddzielne kolumny.Zapytanie postgreSQL - zliczanie wartości kolumn pasujących do dwóch kolumn

To DDL dla moich tabelach: Dane

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

próbki z tabel

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 

Chcę policzyć nowych klientów, stałych klientów i gold_customers przez miasto.

Muszę liczyć osobno dla ("nowy", "zwykły", "złoty"). Oto wyjście, które chcę:

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

możliwe duplikat [T-SQL: czy jest możliwe, aby określić stan w Count()?] (http://stackoverflow.com/questions/1400078/t-sql-is-it-possible-to-specify-condition-in-count) – Guffa

+5

+1 dla SQL DDL :) – onedaywhen

Odpowiedz

18

Z tym samym problemem zmagałem się kilka tygodni temu.
To jest to, czego potrzebujesz.

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

Dzięki stary! działa dobrze – openV

6

Mogłabyś grupa na city, a następnie zsumować liczbę stanów w każdym mieście:

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

Dzięki Andomar, działa dobrze, ale nie daje mi zer w Gold. Jesteście szybcy – openV

+0

Trochę spóźnieni do gry, ale może różnica w zerach wynika z sumy kontra count (które zyskują fałszywą ekwiwalencję z powodu powrotu 1 do zera)? –

Powiązane problemy