Запрос возвращает последние 11 финансовых лет в виде строк.Могу ли я использовать LISTAGG (), чтобы преобразовать его в список через запятую? - PullRequest
0 голосов
/ 19 октября 2018

Я составил этот запрос для возврата за последние 11 финансовых лет:

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

Он возвращает следующее:

enter image description here

Я хотел бы преобразовать его в разделенный запятыми VARCHAR2 следующим образом:

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

Есть ли способ использовать LISTAGG() для этого?Или какие-либо другие предложения для прямого запроса PL / SQL (например, оператор SELECT; без блока DECLARE BEGIN END;)?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Попробуйте этот запрос

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);
0 голосов
/ 19 октября 2018

Я бы вычислил значения в подзапросе и затем использовал бы 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
...