2016-11-16 93 views
0

我正在編寫Oracle SQL以獲取詳細和總結報告。我的詳細報告是完成示例輸出行將是:SQL Sum不能正常工作

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,然後將每列SUM。

我的詳細報告返回17k行,我的摘要報告返回174行,但總和不正確。摘要報告的示例輸出是三種類型之一:「域名,1,0」或「域名1,1」或「域名,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 
+1

**首先**你不需要'q.qual_id,q.qual_title'。 **第二**。如果你的小組沒有返回你想要的結果,檢查只是內部子句組看起來不錯**最後**推廣使用'JOIN' sintaxis,Aaron Bertrand寫了一篇很好的文章[壞習慣踢:用舊(http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx)。 –

+0

去@JuanCarlosOropeza第二點。當運行它自己的時候,'inner_clause'的結果看起來像你期望的那樣嗎?也就是說,您是否從該自定義函數的懸停中獲得值「Y」和「N」?它是否給你超過2或3個結果? – JNevill

+0

我建議刪除q.qual_id和q.qual_title - 謝謝。然後我刪除了GROUP BY來檢查內部的SELECT。內部條款 SUBSTR(包)AS status_remday確實輸出Y和N,並且外部選擇 解碼(status_remday,'Y',1,0)AS COMPLETE, decode(status_remday,'N',1,0)AS INCOMPLETE 沒有輸出1和0,如預期的 結果如下: 第一個域名,Y,1,0 第二個域名,N,0,1 Inner Select似乎工作正常。 –

回答

0

內部子句需要DISTINCT更多字段的結果。最終的解決方案是:

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