Вернуть значение параметра, если данные для этого значения не возвращаются? - PullRequest
0 голосов
/ 03 июня 2019

Мой отчет в SSRS принимает несколько студентов. Пользователь хочет, чтобы отчет возвращал студента (в своей собственной строке), даже если запрос не возвращает никаких данных I.E. идентификатор недействителен Таким образом, если пользователь вводит 10 студентов и 5 из них недействительны, возвращают данные для 5 «хороших» IDS и возвращают 5 строк, где первый столбец будет недопустимым, а второй столбец будет иметь «недопустимый идентификатор». "сообщение.

Я попытался UNION с параметром multiselect и скомпилированным параметром JOINed, но я не могу понять, как получить каждый недопустимый идентификатор в отдельной строке.

SELECT ODSMGR.STUDENT_COURSE.ID, 
   ODSMGR.STUDENT_COURSE.Name, 
   ODSMGR.ACADEMIC_STUDY.STUDENT_LEVEL, 
   SUM(ODSMGR.STUDENT_COURSE.COURSE_CREDITS) CREDITS,
   NVL(SUM(AMOUNT),0) Fees,
   ODSMGR.PERSON_DETAIL.EMAIL_PREFERRED_ADDRESS,
   EMPLOYEE_POSITION_OSU.SUPERVISOR_NAME,
   EMPLOYEE_POSITION_OSU.SUPERVISOR_ID,
   MST_PERSON.EMAIL_PREFERRED_ADDRESS SupervisorEmail
FROM ODSMGR.STUDENT_COURSE 
INNER JOIN ODSMGR.ACADEMIC_STUDY
   ON ODSMGR.STUDENT_COURSE.PERSON_UID = ODSMGR.ACADEMIC_STUDY.PERSON_UID 
   AND ODSMGR.STUDENT_COURSE.ACADEMIC_PERIOD = ODSMGR.ACADEMIC_STUDY.ACADEMIC_PERIOD 
INNER JOIN ODSMGR.PERSON_DETAIL
   ON ODSMGR.STUDENT_COURSE.PERSON_UID = ODSMGR.PERSON_DETAIL.PERSON_UID  
LEFT OUTER JOIN AR_DETAIL_OSU 
   ON AR_DETAIL_OSU.PIDM = ODSMGR.STUDENT_COURSE.PERSON_UID
   AND TERM_CODE = ODSMGR.STUDENT_COURSE.ACADEMIC_PERIOD
   AND detail_code = 'INC1'
LEFT OUTER JOIN EMPLOYEE_POSITION_OSU
   ON EMPLOYEE_POSITION_OSU.PERSON_UID = ODSMGR.STUDENT_COURSE.PERSON_UID
   AND EMPLOYEE_POSITION_OSU.POSITION_STATUS = 'A'
LEFT OUTER JOIN MST_PERSON 
   ON MST_PERSON.PERSON_UID = EMPLOYEE_POSITION_OSU.SUPERVISOR_ID

WHERE ODSMGR.STUDENT_COURSE.PERSON_UID = :PIDMParameter
   and ODSMGR.STUDENT_COURSE.ACADEMIC_PERIOD = :AcademicPeriodCodeParameter
   and COURSE_REGISTER_IND = 'Y'
   and WITHDRAWN_IND = 'N'
   and NVL(ODSMGR.PERSON_DETAIL.CONFIDENTIALITY_IND,'N') = 'N'
GROUP BY    ODSMGR.STUDENT_COURSE.ID, 
        ODSMGR.STUDENT_COURSE.Name, 
        ODSMGR.ACADEMIC_STUDY.STUDENT_LEVEL,
        ODSMGR.PERSON_DETAIL.EMAIL_PREFERRED_ADDRESS,
        EMPLOYEE_POSITION_OSU.SUPERVISOR_NAME,
        EMPLOYEE_POSITION_OSU.SUPERVISOR_ID,
        MST_PERSON.EMAIL_PREFERRED_ADDRESS

Приведенный выше код является просто основным кодом. Я понятия не имею, как заставить его вернуть parms, если нет данных. : PIDMParameter может быть любым числом идентификаторов.

1 Ответ

0 голосов
/ 04 июня 2019

Ass u me учитывая, что ваши идентификаторы являются целыми числами, я создал бы таблицу всех идентификаторов, а затем использовал бы ее в качестве основной таблицы, к которой присоединяется ваш текущий запрос.

;WITH IDS AS  
    (  
        SELECT 1 AS PERSON_UID
        UNION ALL  
        SELECT I.PERSON_UID + 1 
        FROM IDS I
        WHERE I.PERSON_UID < 99999  
)

SELECT PERSON_UID 
INTO #PERSON_UIDs
FROM IDS 
WHERE PERSON_UID IN (4, 7, 999)
OPTION(MAXRECURSION 0)

Затем ВСТАВЬТЕ временную таблицу в таблицу ученического курса.Вам нужно использовать LEFT JOINs, чтобы идентификаторы из временной таблицы #PERSON_IDS отображались, даже если идентификатор не существует в других таблицах.

SELECT ... 
FROM #PERSON_UIDs ID 
LEFT JOIN ODSMGR.STUDENT_COURSE SC ON ID.PERSON_UID = SC.PERSON_UID 
...

Я только что понял, что это то, что предложил @Harry - хотя Oracle имеет рекурсивные CTE с 11g.2, поэтому я думаю, что это должно работать, хотя я не работал с Oracle годами.

Рекурсия в Oracle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...