【问题标题】:SQL Sum not working correctly with group bySQL Sum 无法与 group by 一起正常工作
【发布时间】: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 推广使用 explict JOIN sintaxis,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


【解决方案1】:

内部子句需要为结果区分更多字段。最终的解决方案是:

SELECT inner_clause.dmn_id,
       inner_clause.qual_title,
       SUM(decode(status_remday,'Y',1,0)) AS COMPLET,
       SUM(decode(status_remday,'N',1,0)) AS INCOMPLET,
       COUNT(decode(status_remday,'Y',1,'N',1)) AS TOTAL,
       SYSDATE AS CURRENTDATETIME
       FROM
       (SELECT DISTINCT q.qual_id,
             q.qual_title,
             sq.stud_id,
             s.lname,
             s.fname,
             s.mi,
             s.dmn_id,
             sq.assgn_dte,
             sq.qual_id,
             NVL(userPref.preferred_timezone,pkg_state.get_default_timezone()) AS preferred_timezone,
             DECODE(S.NOTACTIVE,'Y','label.NotActive', 'N','label.Active') AS NOTACTIVE,
             s.email_addr,
             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] */
             ORDER BY 1
       ) inner_clause     
GROUP BY inner_clause.dmn_id, inner_clause.qual_title
ORDER BY inner_clause.dmn_id

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    • 2018-02-15
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    相关资源
    最近更新 更多