2013-12-16 4 views
0

У меня есть PostgreSQLtable структурирована следующим образом:Count на перечислимого типа в PostgreSQL

file(owner_id int, filename text, status status_type) 

с status_type определены:

create type status_type as enum 
(
, 'pending' 
    'complete' 
); 

Отсюда, что я хотел бы добиться того, чтобы получить процент сколько файлов имеет статус «полный» из «полной» + «ожидающей» коллекции для того же идентификатора владельца. , например. если у меня есть 10 записей для owner_id = 1, 3 со статусом завершен и 7 со статусом в ожидании, тогда процент будет 30%.

Любая идея, как я могу это сделать только в одном выражении SELECT, и только для владельца owner_id?

ответ

2

что-то вроде этого:

select pending_count, 
     complete_count, 
     case 
      when (pending_count + complete_count) = 0 then null 
      else pending_count::decimal/(pending_count + complete_count) 
     end as percentage 

from (
    select sum(case when status = 'pending' then 1 end) as pending_count, 
     sum(case when status = 'complete' then 1 end) as complete_count 
    from file 
    where owner_id = 1 
) t 

Вы можете использовать, чтобы получить процент для всех пользователей, а также:

select owner_id, 
     pending_count, 
     complete_count, 
     case 
      when (pending_count + complete_count) = 0 then null 
      else pending_count::decimal/(pending_count + complete_count) 
     end as percentage 
from (
    select owner_id, 
     sum(case when status = 'pending' then 1 end) as pending_count, 
     sum(case when status = 'complete' then 1 end) as complete_count 
    from file 
    group by owner_id 
) t 

SQLFiddle пример: http://sqlfiddle.com/#!15/0b341/1

+0

большой работы здесь, спасибо, это именно то, что я искал! – maephisto

Смежные вопросы