2016-05-09 8 views
-2
SELECT A.institution, 
     A.acad_career, 
     A.emplid, 
     a.strm, 
     NVL(
      SUM(
       CASE 
        WHEN  A.repeat_candidate IN ('N', 'Y') 
          AND A.CRSE_GRADE_OFF != 'F' THEN 
         MAX(grade_points) 
        ELSE 
         (grade_points) 
       END 
       ), 
      0 
      ) 
      AS GPA, 
     NVL(SUM(CASE WHEN a.repeat_candidate = 'N' THEN A.UNT_TAKEN END), 0) AS TAKEN, 
     a.acad_prog 
    FROM ps_stdnt_enrl A, ps_STDNT_CLAS_D_VW B 
    WHERE  A.emplid = B.emplid 
     AND A.class_nbr = B.class_nbr 
     AND A.strm = B.strm 
     AND A.acad_career = B.acad_career 
     AND a.STDNT_ENRL_STATUS = 'E' 
     AND a.emplid LIKE '06381313011%' 
GROUP BY a.emplid, 
     a.acad_career, 
     a.institution, 
     a.acad_prog, 
     A.strm 

このクエリは、max関数がなくてもうまく動作します。ここで問題となるのは、この条件で最大値が必要ですが、単一のグループ関数ではないことです。oracle sqlのsum式のcase文でMAX関数を使用する方法は?

+2

質問は何ですか?これはエラーですか?もしそうなら、どんなエラー? – Aleksej

答えて

1

集計関数をネストすることはできません。 ネストされたクエリでこのトリックを試してみてください:

select 
data.institution 
,data.acad_career 
,data.emplid 
,data.strm 
,NVL(SUM(data.GPA), 0) as GPA 
,data.TAKEN 
,data.acad_prog 
from 
(SELECT A.institution, 
     A.acad_career, 
     A.emplid, 
     a.strm, 
     MAX(grade_points) AS GPA, 
     NVL(SUM(CASE WHEN a.repeat_candidate = 'N' THEN A.UNT_TAKEN END), 0) AS TAKEN, 
     a.acad_prog 
    FROM ps_stdnt_enrl A, ps_STDNT_CLAS_D_VW B 
    WHERE  A.emplid = B.emplid 
     AND A.class_nbr = B.class_nbr 
     AND A.strm = B.strm 
     AND A.acad_career = B.acad_career 
     AND a.STDNT_ENRL_STATUS = 'E' 
     AND a.emplid LIKE '06381313011%' 
GROUP BY a.emplid, 
     a.acad_career, 
     a.institution, 
     a.acad_prog, 
     A.strm 
) data 
group by 
data.institution 
,data.acad_career 
,data.emplid 
,data.strm 
,data.TAKEN 
,data.acad_prog 
+0

宮沢さんありがとうございました...私の要求に応じて動作しません、合格したコースを繰り返している生徒の最大グレードが必要です。学生はコース1と2の学期を取って、グレードC +を取得し、 3学期のレポートを開いたときに最高の成績を取る必要がありますが、2学期のレポートを開くときには、C +グレードを返す必要があります。 – saqib