如果没有返回该值的数据,则返回该参数值?

时间:2019-06-03 20:05:26

标签: oracle reporting-services parameters

我在SSRS中的报告接受多个学生证。即使查询没有返回任何数据,用户也希望报表返回学生ID(在其自己的行中)。该ID无效。因此,如果用户输入10个学生ID,其中5个无效,则返回5个“良好” IDS的数据,并返回5行,其中第一列为无效ID,第二列为“无效ID” “消息。

我尝试使用multiselect参数和已编译的JOINed参数实现UNION,但我不知道如何在其自己的行上获取每个无效的ID。

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可以是任意数量的ID。

1 个答案:

答案 0 :(得分:0)

屁股 u 我认为您的ID是整数,因此我将创建一个包含所有ID的表,然后将其用作您当前查询所加入的主表

;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临时表中的ID出现,即使该ID在其他表中不存在也是如此。

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

我刚刚意识到这就是@Harry的建议-尽管Oracle从11g.2开始就有递归CTE,所以我认为这应该可以工作,尽管我多年来没有使用Oracle。

Recursion In Oracle