Я использую Oracle в Hyperion Studio. Я считаю, что это Oracle 11, но я не знаю, как проверить ... это все для меня в новинку, и я очень, очень новичок, прошу прощения.
В любом случае я использую запрос, чтобы вернуть список классов вместе с именами преподавателей, которые их преподают.
Возникают две проблемы:
Имя инструктора разбито на несколько столбцов. Я легко решил эту проблему с помощью рекурсивного CONCAT в вычисляемом элементе:
CONCAT (Request.Instructor_Last_Name,CONCAT(', ',Request.Instructor_First_Name))
- Курс может иметь более одного инструктора. Я хочу, чтобы у каждого курса была только одна строка в результатах, поэтому я решил, что попытаюсь показать всех инструкторов в одном объединенном поле.
Чтобы попытаться решить вторую проблему, я попытался использовать LISTAGG и CONCAT вместе в вычисляемом элементе:
LISTAGG(CONCAT (Request.Instructor_Last_Name,CONCAT(', ',Request.Instructor_First_Name)), 'and ')
WITHIN GROUP (ORDER BY Request.Instructor_Last_Name DESC) "All Instructors"
Это возвращает ошибку ORA-00937: not a single-group group function
.
Это привело меня к следующему вопросу: LISTAGG Query ORA-00937 : не функция одногрупповой группы Я пробовал варианты решения там, но безуспешно. Вот один пример, который я попытался:
LISTAGG(CONCAT (Request.Instructor_Last_Name,CONCAT(', ',Request.Instructor_First_Name)), 'and ')
WITHIN GROUP (ORDER BY Request.Instructor_Last_Name DESC) "All Instructors"
FROM Request
GROUP BY *
Это возвращает ошибку:
ORA-00936: отсутствует выражение
Я тоже пробовал заменить
LISTAGG(CONCAT (Request.Instructor_Last_Name,CONCAT(', ',Request.Instructor_First_Name)), 'and ')
с участием
LISTAGG(Request.Instructor_Last_Name || ', ' || Request.Instructor_First_Name,'and ')
на основе чего-то еще, что я читал, но это, похоже, не имело никакого значения (я даже не уверен, что это сработает в любом случае).
Это меня утомило. Я уверен, что на данный момент ответ, должно быть, ускользает от меня только из-за моей неопытности, поэтому любая помощь очень ценится ...
Вот очень урезанная версия запроса с использованием предложенного кода vkp (это баннеры, как некоторые могут узнать):
SELECT DISTINCT
AL1.SFRSTCR_TERM_CODE, AL1.SFRSTCR_CRN,
AL3.SPRIDEN_FIRST_NAME, AL3.SPRIDEN_LAST_NAME,
CONCAT ((AL3.SPRIDEN_LAST_NAME),CONCAT(', ',(AL3.SPRIDEN_FIRST_NAME))),
select Student_Registration_CRN,
LISTAGG((Instructor_Last_Name||', '||Instructor_First_Name), 'and '))
WITHIN GROUP (ORDER BY Instructor_Last_Name DESC) "All Instructors"
FROM Request
group by Student_Registration_CRN
FROM SATURN.SFRSTCR AL1, SATURN.SIRASGN AL2, SATURN.SPRIDEN AL3
WHERE ( AL1.SFRSTCR_TERM_CODE = AL2.SIRASGN_TERM_CODE (+)
AND AL1.SFRSTCR_CRN = AL2.SIRASGN_CRN (+)
AND AL2.SIRASGN_PIDM = AL3.SPRIDEN_PIDM (+))
AND ((AL3.SPRIDEN_CHANGE_IND IS NULL AND AL1.SFRSTCR_TERM_CODE='201660'))
Это вызывает ошибку:
ORA-00936: отсутствует выражение
Я использовал псевдонимы для некоторых имен столбцов, поэтому попробовал предложенный код без псевдонимов, но это, похоже, не имело значения.
Я пробовал использовать SQL, предложенный Boneist, напрямую импортировав файл .SQL, а не используя визуальный конструктор и вычисляемые элементы. Вот что я пытался запустить:
select distinct
al1.sfrstcr_term_code,
al1.sfrstcr_crn,
al3.spriden_first_name,
al3.spriden_last_name,
al3.spriden_last_name||', '||al3.spriden_first_name,
(select sfrstcr_crn,
listagg(spriden_last_name || ', ' || spriden_first_name, 'and ')
within group (order by spriden_last_name desc)
from request req
where sfrstcr_crn = al1.sfrstcr_crn
group by sfrstcr_crn) "All Instructors"
from saturn.sfrstcr al1
left outer join saturn.sirasgn al2 on (al1.sfrstcr_term_code = al2.sirasgn_term_code
and al1.sfrstcr_crn = al2.sirasgn_crn)
left outer join saturn.spriden al3 on (al2.sirasgn_pidm = al3.spriden_pidm(+))
where al3.spriden_change_ind is null
and al1.sfrstcr_term_code = '201660';
К сожалению, это возвращает ошибку:
ORA-00933: Команда SQL не завершена должным образом
Я подумал, основываясь на некотором поиске, что могло быть так, что кавычки не импортировались правильно, поэтому я попробовал кое-что еще более простое:
select distinct
al1.sfrstcr_term_code,
al1.sfrstcr_crn,
al3.spriden_first_name,
al3.spriden_last_name
from saturn.sfrstcr al1
left outer join saturn.sirasgn al2 on (al1.sfrstcr_term_code = al2.sirasgn_term_code
and al1.sfrstcr_crn = al2.sirasgn_crn)
left outer join saturn.spriden al3 on (al2.sirasgn_pidm = al3.spriden_pidm(+))
where al3.spriden_change_ind is null;
Но я все равно получаю ту же ошибку ... ???? Я попытался найти, что еще могло ее вызвать, но не нашел ничего полезного ... Я не уверен, что еще попробовать на этом этапе.
group by *
? что это должно делать? - person Vamsi Prabhala   schedule 18.05.2016