Преобразование строк в столбцы в postgresql - PullRequest
0 голосов
/ 02 июня 2018

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

monthname   2017 year(amount)    2018 year(amount) 
Jan          10                    250
feb          20                    350
mar          40                    100

ниже мой запрос с использованием функции кросс-таблицы

SELECT *
FROM   crosstab(
$$select  
SUM(standard_loan_account_balance) as TOTAL_AMOUNT
,extract (year from mgc.transaction_date) as monthname
,extract(MONTH from mgc.transaction_date) as monthnumber

from  bankfair.tbl_das_monthly_growth_chart mgc

where  mgc.transaction_date
between (select (SELECT APP.app_today_date FROM bankfair.tbl_cmn_application_date app)+'-12 month'::interval) 
and (SELECT APP.app_today_date FROM bankfair.tbl_cmn_application_date app) group by monthnumber,monthname
order by 1,2
$$
) as ct ("TOTAL_AMOUNT" numeric,"monthnumber" double precision,"monthname" double precision)

я не получил ожидаемый результат

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

В желаемом наборе результатов столбцы имеют вид

  monthname   2017 year(amount)    2018 year(amount) 

Но в предложении AS, которое квалифицирует результат вызова crosstab (), вы добавили это, что, по-видимому, соответствует вашему неповоротномустолбцы:

   as ct ("TOTAL_AMOUNT" numeric,"monthnumber" double precision,"monthname" double precision)

Это неверно, поскольку в предложении AS должны точно указываться столбцы с поворотным выводом.Похоже, что вы не поняли этот аспект crosstab(), так как вы поместили столбцы непотвращенного вывода.

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

0 голосов
/ 02 июня 2018

Я бы начал с простой не кросс-таблицы версии запроса.Это должно делать то, что вы хотите:

select to_char(mgc.transaction_date, 'Month') as monthname,
       sum(case when to_char(mgc.transaction_date, 'YYYY') = '2017'
                then standard_loan_account_balance else 0
           end) as slab_2017,
       sum(case when to_char(mgc.transaction_date, 'YYYY') = '2018'
                then standard_loan_account_balance else 0
           end) as slab_2018
from bankfair.tbl_das_monthly_growth_chart mgc
group by monthname, extract(month from mgc.transaction_date)
order by monh(mgc.transaction_date);

Затем вы можете преобразовать это в кросс-таблицу, если вам нужно.

...