查询将过去 11 个会计年度作为行返回。我可以使用 LISTAGG() 将其转换为逗号分隔的列表吗?

Posted

技术标签:

【中文标题】查询将过去 11 个会计年度作为行返回。我可以使用 LISTAGG() 将其转换为逗号分隔的列表吗?【英文标题】:Query returns last 11 fiscal years as rows. Can I get use LISTAGG() to convert it to a comma separated list? 【发布时间】:2018-10-18 21:03:45 【问题描述】:

我编写了这个查询来返回最近 11 个会计年度:

SELECT TO_NUMBER(EXTRACT(YEAR FROM ADD_MONTHS(SYSDATE,+3)))-LEVEL+1 
FROM DUAL CONNECT BY LEVEL <= 11;

它返回以下内容:

我想把它转换成逗号分隔的VARCHAR2,如下:

'2019,2018,2017,2016,2015,2014,2013,2012,2011,2010,2009'

有没有办法为此使用LISTAGG()?或者对于直接 PL/SQL 查询的任何其他建议(即,SELECT 语句;没有 DECLARE BEGIN END; 块)?

谢谢!

【问题讨论】:

【参考方案1】:

我会计算子查询中的值,然后使用LISTAGG()

with x as (
  SELECT TO_NUMBER(EXTRACT(YEAR FROM ADD_MONTHS(SYSDATE,+3)))-LEVEL+1 as y
  FROM DUAL CONNECT BY LEVEL <= 11
)
select listagg(y, ',') within group (order by y desc) from x

结果:

LISTAGG(Y,',')WITHINGROUP(ORDERBYYDESC)             
------------------------------------------------------
2019,2018,2017,2016,2015,2014,2013,2012,2011,2010,2009

【讨论】:

谢谢,穿刺者;那行得通!我不知道 WITH 语法。【参考方案2】:

试试这个查询

SELECT LISTAGG(Y, ',') WITHIN GROUP (ORDER BY Y DESC) AS LIS FROM
(SELECT TO_NUMBER(EXTRACT(YEAR FROM ADD_MONTHS(SYSDATE, +3))) - LEVEL + 
1 AS Y FROM DUAL CONNECT BY LEVEL <= 11);

【讨论】:

以上是关于查询将过去 11 个会计年度作为行返回。我可以使用 LISTAGG() 将其转换为逗号分隔的列表吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中使用 Pandas 创建会计年度列?

在 PostgreSQL 中,选择会计年度月份格式作为日期列

统计每个会计年度的不同客户数量并在查询结果中显示所有日期

将报告拆分为一个会计年度的季度

计算财政年度和季度

如何在该字典中引用 Pandas 数据框中的键?