Как мне повернуть таблицу, чтобы показать два отдельных столбца - PullRequest
1 голос
/ 25 сентября 2019

(моя база данных показывает мне каждого отдельного человека и сколько у него выплат и на какой стадии они есть - к сожалению, не у каждого человека есть все 4 выплаты)

Я создал таблицу со средними значениями дляразличные этапы, называемые выплатой 1, выплатой 2, выплатой 3 и выплатой 4.

На каждом этапе предусмотрена сумма выплаты, и есть несколько человек, которые получают разные суммы выплаты.

У меня возникла проблема с поворотом этой таблицы, чтобы у меня было 2 столбца с этапом выплаты и средним значением.Мне нужно это, чтобы я мог использовать это как визуализацию гистограммы в метабазе.

У меня есть этап, на котором я могу легко показать средние значения (см. Ниже)

select 
    round(avg(payout_1)::numeric,2) as avg_payout_1,
    round(avg(payout_2)::numeric,2) as avg_payout_2,
    round(avg(payout_3)::numeric,2) as avg_payout_3,
    round(avg(payout_4)::numeric,2) as avg_payout_4
    from payout_table

В результате я вижу средние значения для выплаты (yay), однако теперь я хочу получить2 столбца, 1 с указанием типа выплаты и 2. средняя выплаченная сумма

Это мой результат:

|------------------|---------------|---------------|---------------|
|   avg_payout_1   |  avg_payout_2 |  avg_payout_3 |  avg_payout_4 |
|------------------|---------------|---------------|---------------|
|       34.32      |      145.11   |     78.65     |      96.76    |
|------------------|---------------|---------------|---------------|

Я бы хотел показать:

|------------------|---------------|
|      payout      |      avg      |  
|------------------|---------------|
|     payout_1     |      34.32    | 
|------------------|---------------|
|     payout_2     |      145.11   | 
|------------------|---------------|

и т.д.

Ответы [ 2 ]

0 голосов
/ 25 сентября 2019

Использование unnest():

select 
    unnest(array[
        'payout_1', 
        'payout_2', 
        'payout_3', 
        'payout_4']) as payout,
    unnest(array[
        round(avg(payout_1)::numeric,2),
        round(avg(payout_2)::numeric,2),
        round(avg(payout_3)::numeric,2),
        round(avg(payout_4)::numeric,2)]) as avg
from payout_table

или jsonb:

select key as payout, value::numeric as avg
from (
    select
        round(avg(payout_1)::numeric,2) as payout_1,
        round(avg(payout_2)::numeric,2) as payout_2,
        round(avg(payout_3)::numeric,2) as payout_3,
        round(avg(payout_4)::numeric,2) as payout_4
    from payout_table
    ) s
cross join jsonb_each(to_jsonb(s))

Db <> скрипка

0 голосов
/ 25 сентября 2019

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

select
unnest(array [a1,a2,a3,a4]),
unnest(array ['avg_payout_1','avg_payout_2','avg_payout_3','avg_payout_4'])
from(
select 
    round(avg(payout_1)::numeric,2) a1,
    round(avg(payout_2)::numeric,2) a2,
    round(avg(payout_3)::numeric,2) a3,
    round(avg(payout_4)::numeric,2) a4
    from payout_table) a

Это не самое приятное решение, но оно работает.

...