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

问题描述

我编写了这个查询来返回最近 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;块)的任何其他建议?

谢谢!

标签: sqloracleoracle11goracle10g

解决方案


我将计算子查询中的值,然后使用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

推荐阅读