Как представить группы подсчетов и сумм в виде столбцов в представлении SQL? - PullRequest
0 голосов
/ 17 января 2019

В основном у меня есть mytable в Postgresql, который определен

id integer,
ownername text,
length integer,
status integer

Предполагаемый результат - создать представление, которое будет иметь следующие столбцы для каждой строки имени владельца

 ownername  | count_in_status1 | sum_length_status1 | count_in_status2 | sum_length_status2 | count_in_status3 | sum_length_status3 | ..... | total_count | total_sum_length 

Это немного сложно объяснить, но в основном мне нужен счет и сумма на имя владельца с общим количеством и общей суммой длины в конце. На данный момент существует 5 статусов

попробовал ниже

create view myview as     
select ownername, status, count(*), sum(length) from mytable group by ownername, status

Это возвращает данные, но не самым эффективным способом, который я представил выше. Как этого добиться?

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Использование Filter - элегантное решение (см. Ответ Гордона Линоффа) * ​​1002 *

Для большей совместимости со многими базами данных, Ян также может написать:

create view myview as     
select ownername,
       sum(case when status = 1 then 1      else 0 end) as cnt_status_1,
       sum(case when status = 1 then length else 0 end) as len_status_1,
       sum(case when status = 1 then 1      else 0 end) as cnt_status_2,
       sum(case when status = 1 then length else 0 end) as len_status_2,           
       . . .  -- continue for each status
       count(*) as cnt,
       sum(length) as length
from mytable
group by ownername;
0 голосов
/ 17 января 2019

Я думаю, это то, что вы хотите:

create view myview as     
    select ownername, 
           count(*) filter (where status = 1) as cnt_status_1,
           sum(length) filter (where status = 1) as len_status_1,
           count(*) filter (where status = 2) as cnt_status_2,
           sum(length) filter (where status = 2) as len_status_2,
           . . .  -- continue for each status
           count(*) as cnt,
           sum(length) as length
    from mytable
    group by ownername;
...