PostgresSQL: использование предложения Where при распаковке с существующим соединением

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

select fbr.organization, fbr.year, a.accounttype, unnest(array[concat(year,'0101'), concat(year,'0201'), concat(year,'0301'), concat(year,'0401'), concat(year,'0501'), concat(year,'0601'), concat(year,'0701'), concat(year,'0801'), concat(year,'0901'), concat(year,'1001'), concat(year,'1101'), concat(year,'1201')])::date as month, unnest(array[sum(jan), sum(feb), sum(mar), sum(apr), sum(may), sum(jun), sum(jul), sum(aug), sum(sep), sum(oct), sum(nov), sum(dec)]) AS balance from fundbalancereport as fbr
left join account as a on a.accountnumber = split_part(text,' ',1) and a.organization = fbr.organization
where year > 2018
and left(text,1) = '1'
and accounttype = 'Bank'
group by fbr.organization, fbr.year, a.accounttype

Это дает точный формат, который мне нужен, что-то вроде:

"organization","year","accounttype","month","balance"
"org1",2020,"Bank","2020-01-01","500.00000"
"org1",2020,"Bank","2020-02-01","550.00000"
"org1",2020,"Bank","2020-03-01","650.00000"
"org1",2020,"Bank","2020-04-01","450.00000"
"org1",2020,"Bank","2020-05-01","450.00000"
"org1",2020,"Bank","2020-06-01","450.00000"
"org1",2020,"Bank","2020-07-01","450.00000"
"org1",2020,"Bank","2020-08-01","450.00000"
"org1",2020,"Bank","2020-09-01","450.00000"
"org1",2020,"Bank","2020-10-01","450.00000"
"org1",2020,"Bank","2020-11-01","450.00000"
"org1",2020,"Bank","2020-12-01","450.00000"

В идеале я хотел бы добавить предложение where месяца меньше или равно сегодняшнему дню, что должно дать:

"organization","year","accounttype","month","balance"
"org1",2020,"Bank","2020-01-01","500.00000"
"org1",2020,"Bank","2020-02-01","550.00000"
"org1",2020,"Bank","2020-03-01","650.00000"
"org1",2020,"Bank","2020-04-01","450.00000"

Я прочитал этот вопрос: Как добавить предложение where с помощью не вкладываться в запрос sql?

Но когда я попытался добавить дополнительный SELECT, я получил сообщение об ошибке, что было возвращено несколько строк, поэтому я немного потерялся, поскольку у меня уже есть существующее соединение, которое мне нужно.

Я старался:

select fbr.organization, fbr.year, a.accounttype, 
(select unnest(array[concat(year,'0101'), concat(year,'0201'), concat(year,'0301'), concat(year,'0401'), concat(year,'0501'), concat(year,'0601'), concat(year,'0701'), concat(year,'0801'), concat(year,'0901'), concat(year,'1001'), concat(year,'1101'), concat(year,'1201')])::date as month), (select unnest(array[sum(jan), sum(feb), sum(mar), sum(apr), sum(may), sum(jun), sum(jul), sum(aug), sum(sep), sum(oct), sum(nov), sum(dec)]) AS balance) from fundbalancereport as fbr
left join account as a on a.accountnumber = split_part(text,' ',1) and a.organization = fbr.organization
where year > 2018
and left(text,1) = '1'
and accounttype = 'Bank'
group by fbr.organization, fbr.year, a.accounttype

и получил

ERROR:  more than one row returned by a subquery used as an expression

Любое руководство было бы очень полезно, спасибо!


person Steven Carlton    schedule 03.04.2020    source источник
comment
Похоже, вы добавили дополнительный SELECT не в то место. Пожалуйста, покажите нам, что вы сделали.   -  person jjanes    schedule 03.04.2020
comment
@jjanes Я уверен, что ты прав. Отредактировал мой вопрос.   -  person Steven Carlton    schedule 03.04.2020


Ответы (1)


Переместить unnest из части select

select unnest(array['20190101'::date, '20200101'::date, '20210101'::date]) d

в from часть запроса и добавить where часть

select d
from unnest(array['20190101'::date, '20200101'::date, '20210101'::date]) d
where d<=now()

Редактировать:

Я считаю, что вы хотите развернуть данные, в этом случае ваш запрос может быть:

select fbr.organization, fbr.year, a.accounttype, fbr.month, sum(fbr.val) as balance
from
  (
    select organization, year, text, concat(year,'0101')::date as month, jan as val from fundbalancereport union
    select organization, year, text, concat(year,'0201')::date as month, feb as val from fundbalancereport union
    select organization, year, text, concat(year,'0301')::date as month, mar as val from fundbalancereport union
    select organization, year, text, concat(year,'0401')::date as month, apr as val from fundbalancereport union
    select organization, year, text, concat(year,'0501')::date as month, may as val from fundbalancereport union
    select organization, year, text, concat(year,'0601')::date as month, jun as val from fundbalancereport union
    select organization, year, text, concat(year,'0701')::date as month, jul as val from fundbalancereport union
    select organization, year, text, concat(year,'0801')::date as month, aug as val from fundbalancereport union
    select organization, year, text, concat(year,'0901')::date as month, sep as val from fundbalancereport union
    select organization, year, text, concat(year,'1001')::date as month, oct as val from fundbalancereport union
    select organization, year, text, concat(year,'1101')::date as month, nov as val from fundbalancereport union
    select organization, year, text, concat(year,'1201')::date as month, dec as val from fundbalancereport
  ) fbr
left join account as a on a.accountnumber = split_part(text,' ',1) and a.organization = fbr.organization
where year > 2018
and left(text,1) = '1'
and accounttype = 'Bank'
group by fbr.organization, fbr.year, a.accounttype, fbr.month
person lukas    schedule 03.04.2020
comment
Отредактировал свой вопрос, когда пробовал что-то подобное и получил ошибку. Не возражаете ли вы отредактировать свой ответ, чтобы включить больше контекста в то, как это вписывается во весь запрос? - person Steven Carlton; 03.04.2020
comment
Да! Это идеально, за исключением необходимости добавить месяц, где пункт and fbr.month < now() сделал свое дело. - person Steven Carlton; 03.04.2020