Функция Oracle 11g LISTAGG с несколькими подзапросами

Я работаю над Oracle 11g и пытаюсь написать запрос, который будет вставлять '?' за все пропущенные месяцы между двумя датами. Этого я могу добиться. Однако теперь я хочу сопоставить все записи определенного столбца в одной записи. Я использовал функцию LISTAGG для достижения этой цели, однако я получаю сообщение об ошибке «неверный идентификатор» для столбца внутри функции LISTAGG. Вот мой код: -

Select facilitynumber, LISTAGG(facilitystatus, '') WITHIN GROUP (ORDER BY null) "Profile" FROM ( WITH allmonths AS ( SELECT to_date(level, 'MM') AS allmnths FROM dual CONNECT BY LEVEL BETWEEN '01' AND '05' ), months AS ( SELECT * FROM ( SELECT ccds.facilitynumber,ccds.facilitystatus, dsub.filecreationdate as FacilityStatusDate, dsub.submissiondate, ROW_NUMBER() OVER (partition by ccds.facilitynumber,extract(month from dsub.submissiondate) order by dsub.submissiondate DESC) r FROM ccdssubmissions ccds INNER JOIN datasubmission dsub ON ccds.datasubmissionid = dsub.datasubmissionid INNER JOIN datasupplier dsup ON dsub.datasupplierid = dsup.datasupplierid WHERE ccds.matchedcompanynumber = 'TEST9239' ORDER BY dsub.submissiondate DESC ) where r = 1) SELECT allmnths, CASE WHEN facilitystatus IS NULL THEN '?' ELSE facilitystatus END AS "facilitystatus", submissiondate, facilitynumber FROM allmonths LEFT OUTER JOIN months ON extract(month from allmonths.allmnths) = extract(month from months.submissiondate) order by allmnths ) GROUP BY facilitynumber;

Я столкнулся с ошибкой во 2-й строке. Мой подзапрос, т.е. запрос, начинающийся с «WITH», возвращает следующие результаты: –

ALLMNTHS| facilitystatus | submissiondate | facilitynumber 

---------    | ---------------    | ---------------    | ---------------    
01-JAN-16    | U                  | 23-JAN-16          | FAC01              
01-FEB-16    | ?                  | null               | null               
01-MAR-16    | 1                  |05-MAR-16           | FAC01             

Теперь, используя LISTAGG(facilitystatus, ''), я хочу, чтобы мой результат был ->

Profile|  facilitynumber
  U?1          |   FAC01   

Но Oracle не может распознать столбец статуса объекта, и поэтому я не могу достичь желаемого результата.

Любая помощь будет принята с благодарностью.

Спасибо


person Anuja    schedule 23.12.2016    source источник
comment
Во внешнем запросе у вас есть GROUP BY facilitynumber, поэтому вы получаете эту ошибку. Удалите группу и получите строки за последний месяц, это может сработать.   -  person Vijayakumar Udupa    schedule 23.12.2016
comment
Нет. Та же ошибка.   -  person Anuja    schedule 23.12.2016


Ответы (1)


Вы платите цену за то, что является очень плохой практикой, по крайней мере, в Oracle.

Когда вы объявляете имя столбца в двойных кавычках, например "facilitystatus", оно записывается в каталог именно так, как написано — в нижнем регистре. Когда вы ссылаетесь на него во внешнем запросе без двойных кавычек, имя автоматически преобразуется в верхний регистр (это то, что делает Oracle, я не знаю о других продуктах БД). Так что, конечно, есть несоответствие.

Нет абсолютно никакой необходимости в двойных кавычках в подзапросе. Удалите их и посмотрите, что произойдет. (Либо запрос будет работать, либо вы получите другую, не связанную с этим ошибку.) Удачи!

Никогда не используйте имена в двойных кавычках. Они используются по следующим причинам, ни одна из которых не имеет смысла (лучше вообще избегать ситуации):

  • Используйте специфический регистр (вместо регистро-без учета регистра — по умолчанию имена в каталоге записываются всеми заглавными буквами, а в вашем коде вы можете использовать любой регистр)
  • Вставлять пробелы в имена
  • Используйте зарезервированные слова и ключевые слова (например, DATE и COLUMN) в качестве имен столбцов или таблиц.
person mathguy    schedule 23.12.2016
comment
Превосходно! Я не знал о проблеме кавычек. Удаление этих кавычек сработало для меня :) - person Anuja; 23.12.2016