【问题标题】:Return the parameter value if no data is returned for that value?如果没有返回该值的数据,则返回参数值?
【发布时间】:2019-06-03 20:05:26
【问题描述】:

我在 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

以上代码只是基本代码。如果没有数据,我不知道如何让它返回参数。 :PIDMParameter 可以是任意数量的 ID。

【问题讨论】:

  • 我将它添加到 SSRS 的代码块中,但出现错误:查询块的结果列数不正确。工会双方有9个领域? UNION select :IDParameter, '', '', '', '', '', '', '', '' FROM DUAL
  • 您是否考虑过在 oracle 中根据参数构建一个表,然后将该表用作您的数据的基表,以便即使它无效也始终返回?可能类似于 Oracle 中的 SQL SERVER CTE 等价物?

标签: oracle reporting-services parameters


【解决方案1】:

Ass知道您的 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 JOIN 以便 #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

【讨论】:

  • 不幸的是,ID 不是整数。 9 位 varchars。我也无权在 Oracle DB 中创建任何内容。 (Grr。)我实际上是通过发送参数列表(用逗号连接)然后在 CTE 中对其执行 REGEXP_SUBSTR 以用作我的基表来完成此工作的。但是,用户可以输入多少个 ID 似乎是有限制的(看起来大约 290 个 9 位 ID 加上 289 个逗号)。即使我对传入的 ID 数量进行了硬性限制,报告也会在 300 秒时超时。
猜你喜欢
  • 1970-01-01
  • 2018-12-12
  • 2018-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多