Dynami c генерация столбцов в postgres подзапросе - PullRequest
1 голос
/ 08 апреля 2020

Этот запрос ниже дает имя, идентификатор, подписку, открытие, закрытие, итоговую информацию о конкретном году, т. Е. Posts_date является входной информацией для запроса.

select la.name,la.id,la.parent_id,la.is_group,tb1.opening op_1,tb1.closing cl_1,
coalesce((select sum(j.amount) from journal j,voucher v , ledger_account le where j.voucher_id=v.id and le.id=j.ledger_account_id and la.id=le.id and
 v.posted_date::date>='2020-04-01' and v.posted_date::date<='2021-03-31'),0) balance_2020
from ledger_account la left join trialb tb1 on tb1.ledger_account_id=la.id and tb1.fy_id=1

Приведенный выше запрос дает общие данные и остаток 2020 год, Например: - Если мне нужны сальдо с 2005 года, мне снова нужно вставить следующие логики c несколько раз

coalesce((select sum(j.amount) from journal j,voucher v , ledger_account le where j.voucher_id=v.id and le.id=j.ledger_account_id and la.id=le.id and  v.posted_date::date>='2020-04-01' and v.posted_date::date<='2021-03-31'),0) balance_2020

и изменить v.posted дата и имя столбца:
v.posted_date :: date> = '2005-04-01' и v.posted_date :: date <= '2006-03-31'), 0) balance_2005 </strong> и так почти в 15 раз, чтобы получить итоговые сальдо до 2020 года, при которых размер запроса будет увеличиваться с каждым годом и временем выполнения процесса.

Так есть ли альтернативный или возможный способ использования столбцов balance_2005? , balance_2006 .. и так далее может быть сгенерирован динамически, если это необходимо, на основе входных данных для запроса?

1 Ответ

1 голос
/ 08 апреля 2020

Переместите подзапрос в предложение from и используйте условное агрегирование, чтобы получить различные суммы:

select
  la.name,
  la.id,
  la.parent_id,
  la.is_group,
  tb1.opening op_1,
  tb1.closing cl_1,
  sums.balance_2018,
  sums.balance_2019,
  sums.balance_2020
from ledger_account la
left join trialb tb1 on tb1.ledger_account_id = la.id and tb1.fy_id = 1
left join
(
  select
    j.ledger_account_id,
    sum(case when v.posted_date::date >= date '2018-04-01' and v.posted_date::date <= date '2019-03-31') then j.amount else 0 end) as balance_2018,
    sum(case when v.posted_date::date >= date '2019-04-01' and v.posted_date::date <= date '2020-03-31') then j.amount else 0 end) as balance_2019,
    sum(case when v.posted_date::date >= date '2020-04-01' and v.posted_date::date <= date '2021-03-31') then j.amount else 0 end) as balance_2020
  from journal j
  join voucher v on v.id = j.voucher_id
  group by j.ledger_account_id
) sums on sums.ledger_account_id = la.id
order by la.name;

Если вы не хотите фиксированных лет, то вы не можете использовать столбцы, но вместо этого должны использовать строки. Вам нужно вычислить, чтобы получить дату от финансового года, но это всего лишь вычитание трех месяцев из него.

select
  la.name,
  la.id,
  la.parent_id,
  la.is_group,
  tb1.opening op_1,
  tb1.closing cl_1,
  sums.fiscal_year
  sums.balance
from ledger_account la
left join trialb tb1 on tb1.ledger_account_id = la.id and tb1.fy_id = 1
left join
(
  select
    j.ledger_account_id,
    extract(year from v.posted_date - interval '3 months') as fiscal_year
    sum(j.amount) as balance
  from journal j
  join voucher v on v.id = j.voucher_id
  group by j.ledger_account_id, extract(year from v.posted_date - interval '3 months')
) sums on sums.ledger_account_id = la.id
order by la.name, sums.fiscal_year;

Ваше приложение должно обрабатывать годовые данные учетной записи в al oop.

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

  ...
  where extract(year from v.posted_date - interval '3 months') between 2010 and 2020
  group by j.ledger_account_id, extract(year from v.posted_date - interval '3 months')
  ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...