首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >postgres子查询中列的动态生成

postgres子查询中列的动态生成
EN

Stack Overflow用户
提问于 2020-04-08 06:43:43
回答 1查看 59关注 0票数 1

下面的查询给出了特定年份的名称、id、订阅、打开、关闭、totalAmount详细信息,即posted_date是查询的输入。

代码语言:javascript
运行
复制
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年的总数据和余额,For Ex:-如果我需要2005年的余额,我需要多次粘贴下面的逻辑

代码语言:javascript
运行
复制
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.post_date::date<=’2006-03-31‘),0) balance_2005等几乎15次,以获得到2020年的总余额,到2020年,查询的大小每年都在增加,所花费的时间也在不断增加。

那么,是否有任何替代或可能的方式使用列balance_2005,balance_2006..。因此,如果有必要,可以根据提供给查询?的输入动态生成。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-08 07:04:28

将子查询移到from子句,并使用条件聚合获取各种和:

代码语言:javascript
运行
复制
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;

如果不希望固定年份,则不能使用列,而必须使用行。你需要一个计算从日期到财政年度,但这仅仅是减去三个月。

代码语言:javascript
运行
复制
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;

让你的应用程序在一个循环处理一个帐户的年度数据。

如果您想避免获得一个非常大的结果集并将其限制在特定的年份内,您可以添加以下条件。

代码语言:javascript
运行
复制
  ...
  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')
  ...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61094745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档