我在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。
答案 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。