Số lượng Postgres với các điều kiện khác nhau trên cùng một truy vấn


38

EDIT Postgres 9.3

Tôi đang làm việc trên một báo cáo có lược đồ sau: http://sqlfiddle.com/#!15/fd104/2

Truy vấn hiện tại đang hoạt động tốt, trông như thế này:

nhập mô tả hình ảnh ở đây

Về cơ bản nó là một tham gia 3 bảng bên trong. Tôi không thực hiện truy vấn này nhưng nhà phát triển đã bỏ nó và tôi muốn sửa đổi truy vấn. Như bạn có thể thấy, TotalApplicationchỉ cần đếm tổng số ứng dụng dựa trên a.agent_id. Và bạn có thể thấy totalapplicationcột trong kết quả. Những gì tôi muốn là loại bỏ điều đó và thay đổi totalapplicationthành một cột hai mới. Tôi muốn thêm một completedsurveypartitalsurveycột. Vì vậy, về cơ bản phần này sẽ trở thành

SELECT a.agent_id as agent_id, COUNT(a.id) as CompletedSurvey
FROM forms a WHERE  a.created_at >= '2015-08-01' AND 
a.created_at <= '2015-08-31' AND disposition = 'Completed Survey'
GROUP BY a.agent_id

Tôi vừa thêm AND disposition = 'Completed Survey'Nhưng tôi cần một cột khác partialsurveycó cùng truy vấn với completedsurveysự khác biệt duy nhất là

AND disposition = 'Partial Survey'

COUNT(a.id) as PartialSurvey

Nhưng tôi không biết nơi nào để đặt truy vấn đó hoặc làm thế nào sẽ là truy vấn trông như thế nào. Vì vậy, đầu ra cuối cùng có các cột này

agent_id, name, completedsurvey, partialsurvey, loginhours, applicationperhour, rph

Một khi nó ổn thì hãy đăng ký và rph tôi có thể tự sửa nó

Câu trả lời:


75

Nếu tôi hiểu bạn chính xác, bạn đang tìm kiếm một tổng hợp được lọc (có điều kiện):

SELECT a.agent_id as agent_id, 
       COUNT(a.id) filter (where disposition = 'Completed Survey') as CompletedSurvey, 
       count(a.id) filter (where disposition = 'Partial Survey') as partial_survey
FROM forms a 
WHERE a.created_at >= '2015-08-01' 
  AND a.created_at <= '2015-08-31' 
GROUP BY a.agent_id;

Chỉnh sửa
cho các phiên bản cũ hơn (<9,4) bạn cần sử dụng casecâu lệnh:

SELECT a.agent_id as agent_id, 
       COUNT(case when disposition = 'Completed Survey' then a.id end) as CompletedSurvey, 
       COUNT(case when disposition = 'Partial Survey' then a.id end) as partial_survey
FROM forms a 
WHERE a.created_at >= '2015-08-01' 
  AND a.created_at <= '2015-08-31' 
GROUP BY a.agent_id;

Tôi đang sử dụng 9.3. Là nó ổn?
jackhammer013

@JoeneFloresca: không, trong 9.3 bạn cần một CASEtuyên bố. Bạn phải luôn chỉ định phiên bản bạn đang sử dụng, đặc biệt nếu đó không phải là phiên bản hiện tại.
a_horse_with_no_name

Cảm ơn rất nhiều! làm việc hoàn hảo bây giờ Xin lỗi vì điều đó, đã chỉnh sửa bài viết của tôi và sẽ ghi nhớ điều đó vào lần tới. Cảm ơn :)
jackhammer013

Liên kết đến các tài liệu trên FILTER: postgresql.org/docs/civerse/static/ từ
bcattle

Hữu ích cho tôi (/)
Sajeev 23/07/18
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.