2013-06-12 46 views
12

Từ hai cột trong bảng của tôi, tôi muốn nhận được một số thống nhất cho các giá trị trong các cột này. Như một ví dụ, hai cột là:Postgresql Nhiều số đếm cho một bảng

Bảng: Báo cáo

| type  | place | 
----------------------------------------- 
| one   | home | 
| two   | school | 
| three  | work | 
| four  | cafe | 
| five  | friends | 
| six   | mall | 
| one   | work | 
| one   | work | 
| three  | work | 
| two   | cafe | 
| five  | cafe | 
| one   | home | 

Nếu tôi làm: CHỌN loại, count (*) từ báo cáo nhóm theo loại

tôi nhận được:

| type  | count | 
----------------------------- 
| one   | 4  | 
| two   | 2  | 
| three  | 2  | 
| four  | 1  | 
| five  | 2  | 
| six   | 1  | 

Tôi đang cố gắng để có được một cái gì đó như thế này: (một cột ngoài cùng bên phải với các loại của tôi được nhóm lại với nhau và nhiều cột wit h các thung lũng đếm cho từng vị trí) tôi nhận được:

| type  | home | school | work | cafe | friends | mall | 
----------------------------------------------------------------------------------------- 
| one   | 2  |   | 2  |   |   |   | 
| two   |   | 1  |   | 1  |   |   | 
| three  |   |   | 2  |   |   |   | 
| four  |   |   |   | 1  |   |   | 
| five  |   |   |   | 1  | 1  |   | 
| six   |   |   |   |   |   | 1  | 

đó sẽ là kết quả của việc chạy một số giống như một ở trên cho mọi nơi như thế này:

SELECT type, count(*) from reports where place = 'home' 
group by type 
SELECT type, count(*) from reports where place = 'school' 
group by type 
SELECT type, count(*) from reports where place = 'work' 
group by type 
SELECT type, count(*) from reports where place = 'cafe' 
group by type 
SELECT type, count(*) from reports where place = 'friends' 
group by type 
SELECT type, count(*) from reports where place = 'mall' 
group by type 

Đây có phải là có thể với postgresql ?

Xin cảm ơn trước.

+0

Ở đây chúng ta có một số tra cứu đúng dứt khoát. ví dụ: 'nhà', 'trường học' ...) tôi có tra cứu situtation có thể biết tại thời gian chạy chỉ. bất kỳ mẫu sql nào cho điều đó? – Pyare

Trả lời

29

bạn có thể sử dụng case trong trường hợp này -

SELECT type, 
     sum(case when place = 'home' then 1 else 0 end) as Home, 
     sum(case when place = 'school' then 1 else 0 end) as school, 
     sum(case when place = 'work' then 1 else 0 end) as work, 
     sum(case when place = 'cafe' then 1 else 0 end) as cafe, 
     sum(case when place = 'friends' then 1 else 0 end) as friends, 
     sum(case when place = 'mall' then 1 else 0 end) as mall 
    from reports 
group by type 

Nó sẽ giải quyết vấn đề của bạn

@ST Mohammed, Để có được kiểu như vậy, chúng tôi chỉ đơn giản là có thể sử dụng using sau group hoặc where điều kiện trong truy vấn bên ngoài , như bên dưới -

select type, Home, school, work, cafe, friends, mall from (
SELECT type, 
     sum(case when place = 'home' then 1 else 0 end) as Home, 
     sum(case when place = 'school' then 1 else 0 end) as school, 
     sum(case when place = 'work' then 1 else 0 end) as work, 
     sum(case when place = 'cafe' then 1 else 0 end) as cafe, 
     sum(case when place = 'friends' then 1 else 0 end) as friends, 
     sum(case when place = 'mall' then 1 else 0 end) as mall 
    from reports 
group by type 
) 
where home >0 and School >0 and Work >0 and cafe>0 and friends>0 and mall>0 
+1

Để nhận các cột trống (null) thay vì 0, hãy bọc các số tiền trong các cuộc gọi 'nullif'. Sử dụng 'count' với' null' thay vì '0' (bằng cách bỏ qua' ELSE 0' hoàn toàn) cho trường hợp thất bại cũng hoạt động tốt, bạn không phải thay đổi thành 'sum'. –

+0

Cảm ơn câu trả lời của các bạn, điều này đã giúp tôi giải quyết vấn đề của mình. – Chuydb

+0

Dấu phẩy cuối cùng trong câu lệnh sql (ngay trước từ khóa "từ") gây ra lỗi. – mosid

12

Trả lời bởi praktik garg là co rrect, nó không phải là cần thiết để sử dụng else 0:

SELECT type, 
     sum(case when place = 'home' then 1 end) as home, 
     sum(case when place = 'school' then 1 end) as school, 
     sum(case when place = 'work' then 1 end) as work, 
     sum(case when place = 'cafe' then 1 end) as cafe, 
     sum(case when place = 'friends' then 1 end) as friends, 
     sum(case when place = 'mall' then 1 end) as mall, 
from reports 
group by type 

Bạn cũng có thể sử dụng cú pháp thậm chí ngắn hơn như sau:

SELECT type, 
     sum((place = 'home')::int) as home, 
     sum((place = 'school')::int) as school, 
     sum((place = 'work')::int) as work, 
     sum((place = 'cafe')::int) as cafe, 
     sum((place = 'friends')::int) as friends, 
     sum((place = 'mall')::int) as mall, 
from reports 
group by type 

này sẽ làm việc vì boolean true được đúc tới 1 khi điều kiện được đáp ứng.

2

Bạn có thể sử dụng khoản lọc cũng như:

SELECT 
    type, 
    sum(1) FILTER (WHERE place = 'home') AS home, 
    sum(1) FILTER (WHERE place = 'school') AS school, 
    sum(1) FILTER (WHERE place = 'work') AS work, 
    sum(1) FILTER (WHERE place = 'cafe') AS cafe, 
    sum(1) FILTER (WHERE place = 'friends') AS friends, 
    sum(1) FILTER (WHERE place = 'mall') AS mall 
FROM 
    reports 
GROUP BY 
    type 
Các vấn đề liên quan