Преобразование строк в столбцы в postgresql
Мне нужно конвертировать строки в столбцы с помощью 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 ответа
Я бы начал с простой не перекрестной версии запроса. Это должно делать то, что вы хотите:
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);
Затем вы можете преобразовать это в кросс-таблицу, если вам нужно.
В желаемом наборе результатов столбцы
monthname 2017 year(amount) 2018 year(amount)
Но в предложении AS, которое квалифицирует результат вызова crosstab(), вы добавили это, что, по-видимому, соответствует вашим неповоротным столбцам:
as ct ("TOTAL_AMOUNT" numeric,"monthnumber" double precision,"monthname" double precision)
Это неправильно, потому что в предложении AS должны точно указываться столбцы с поворотным выводом. Похоже, вы не поняли этот аспект crosstab()
, так как вы ставите столбцы неповоротного вывода.
Столбцы в запросе, переданные в качестве первого аргумента кросс-таблицы, также не совпадают. Первый столбец должен содержать название месяца, второй столбец - год, а третий столбец - сумму. Наконец, вам нужно ограничить количество лет теми, которые жестко прописаны в вашем предложении AS.