【发布时间】:2016-11-16 20:49:30
【问题描述】:
我正在编写 Oracle SQL 以获取详细和摘要报告。我的详细报告以示例输出行结束:
domain name, student name, completed
Domain Name, Student Name, Y
Domain Name, Student Name, N
注意完成的列是“Y”或“N”。
问题在于我的摘要报告。我按域名分组,并将“Y”和“N”的详细报告列“已完成”拆分为“完成”和“未完成”的摘要列。我将“Y”更改为 1 或 0,将“N”更改为 1 或 0,然后对每一列求和。
我的详细报告返回 17k 行,我的摘要报告返回 174 行,但总和不正确。摘要报告的示例输出是以下三种类型之一:“Domain Name, 1, 0”或“Domain Name, 1,1”或“Domain Name, 0, 0”。这些行应包含“域名、254、110”等数字。
任何有关代码的帮助或指导将不胜感激。
SELECT inner_clause.dmn_id,
SUM(decode(status_remday,'Y',1,0)) COMPLETED,
SUM(decode(status_remday,'N',1,0)) INCOMPLETED
FROM
(SELECT DISTINCT q.qual_id,
q.qual_title,
s.dmn_id,
SUBSTR(pkg_student.get_delm_stud_qual_stat_rmday(sq.stud_id, sq.qual_id, sq.qual_id),1,1) AS status_remday
FROM pa_stud_qual sq,
pa_student s,
pa_user_preference userPref,
pa_qual q
WHERE sq.stud_id = s.stud_id
AND s.stud_id = userPref.user_id(+)
AND userPref.user_type(+)='S'
AND sq.qual_id = q.qual_id
/** and q.qual_id in [CurriculumSearch] */
/** and s.stud_id in [UserSearch] */
/** and s.notactive = [UserStatus] */
/** and [security:pa_student s] */
) inner_clause
GROUP BY inner_clause.dmn_id
ORDER BY inner_clause.dmn_id
【问题讨论】:
-
首先你不需要
q.qual_id, q.qual_title。 第二。如果您的 group by 没有返回您想要的结果,请检查该组看起来没问题的只是内部子句 Last 推广使用 explictJOINsintaxis,Aaron Bertrand 写了一篇很好的文章 Bad habits to kick : using old-style JOINs 关于它. -
致@JuanCarlosOropeza 第二点。
inner_clause单独运行时的结果是否符合您的预期?即,您是否从该自定义函数的子字符串中获取值“Y”和“N”?它给你的结果是否超过 2 或 3 个? -
我按照建议删除了 q.qual_id 和 q.qual_title - 谢谢。然后我删除了 GROUP BY 以检查内部 SELECT。 inner_clause SUBSTR(package) AS status_remday 确实输出了 Y 和 N,而外部 Select decode(status_remday,'Y',1,0) AS COMPLETE, decode(status_remday,'N',1,0) AS INCOMPLETE 确实输出了 1's和 0 与预期结果类似:First Domain name, Y, 1, 0 Second Domain name, N, 0, 1 内部 Select 似乎工作正常。
-
只有当我加回 GROUP BY 和包裹在解码语句周围的 SUM 时,它才能正确计算。然后我尝试将解码更改为案例语句 SUM(CASE WHEN status_remday = 'Y' THEN 1 ELSE 0 END) AS "COMPLETE", SUM(CASE WHEN status_remday = 'N' THEN 1 ELSE 0 END) AS "INCOMPLETE" 但没有似乎没有太大的成功。
-
代码正在检索我请求的结果。问题是内部子句需要 DISTINCT 更多字段以获得所需的结果。
标签: sql oracle reporting-services