Sql 我可以强制此Oracle windowing查询返回一行值吗?

Sql 我可以强制此Oracle windowing查询返回一行值吗?,sql,oracle,aggregate-functions,analytic-functions,Sql,Oracle,Aggregate Functions,Analytic Functions,此查询用于替换另一个使用嵌套子查询并相应执行的查询。现在,它确实会为每一列返回正确的结果,但会返回一行,该行具有该列的值,其余为null,然后是另一行,第二列中具有第二个值,其余为null,依此类推。将其设置为“select distinct”有助于将其拆分为仅5行的5个值,但我希望得到一个单行结果,该结果将给出: pidm code date sci eng math soc fl 119 456456 14-JUL-14 89.1 92.3 8

此查询用于替换另一个使用嵌套子查询并相应执行的查询。现在,它确实会为每一列返回正确的结果,但会返回一行,该行具有该列的值,其余为null,然后是另一行,第二列中具有第二个值,其余为null,依此类推。将其设置为“select distinct”有助于将其拆分为仅5行的5个值,但我希望得到一个单行结果,该结果将给出:

pidm  code    date       sci   eng   math   soc   fl
119   456456  14-JUL-14  89.1  92.3  82     90.25 83.67
而不是我现在得到的:

pidm  code    date       sci   eng   math   soc   fl
119   456456  14-JUL-14  89.1  null  null   null  null
119   456456  14-JUL-14  null  null  82     null  null
119   456456  14-JUL-14  null  92.3  null   null  null
119   456456  14-JUL-14  null  null  null   null  83.67
119   456456  14-JUL-14  null  null  null   90.25 null
我对Oracle的窗口功能不太熟悉,虽然我对它应该实现的功能有了基本的了解,但我不太明白如何将它转变为我需要的功能

按现状查询:

SELECT a.szrhstr_pidm AS PIDM, 
       a.szrhstr_hs_code AS HS_Code, 
       a.szrhstr_activity_date,
       SUM(CASE WHEN hsgpa_subj_code='SCI' THEN a.szrhstr_grade END) OVER (PARTITION BY hsgpa_subj_code ORDER BY hsgpa_subj_code ) / COUNT(CASE WHEN hsgpa_subj_code='SCI' THEN a.szrhstr_grade END) OVER (PARTITION BY hsgpa_subj_code ORDER BY hsgpa_subj_code) as "Science_GPA", 
       SUM(CASE WHEN hsgpa_subj_code='ENG' THEN a.szrhstr_grade END) OVER (PARTITION BY hsgpa_subj_code ORDER BY hsgpa_subj_code ) / COUNT(CASE WHEN hsgpa_subj_code='ENG' THEN a.szrhstr_grade END) OVER (PARTITION BY hsgpa_subj_code ORDER BY hsgpa_subj_code) as "English_GPA",
       SUM(CASE WHEN hsgpa_subj_code='MATH' THEN a.szrhstr_grade END) OVER (PARTITION BY hsgpa_subj_code ORDER BY hsgpa_subj_code ) / COUNT(CASE WHEN hsgpa_subj_code='MATH' THEN a.szrhstr_grade END) OVER (PARTITION BY hsgpa_subj_code ORDER BY hsgpa_subj_code) as "Math_GPA",
       SUM(CASE WHEN hsgpa_subj_code='SOC' THEN a.szrhstr_grade END) OVER (PARTITION BY hsgpa_subj_code ORDER BY hsgpa_subj_code ) / COUNT(CASE WHEN hsgpa_subj_code='SOC' THEN a.szrhstr_grade END) OVER (PARTITION BY hsgpa_subj_code ORDER BY hsgpa_subj_code) as "History_GPA",
       ROUND(SUM(CASE WHEN hsgpa_subj_code='FL' THEN a.szrhstr_grade END) OVER (PARTITION BY hsgpa_subj_code ORDER BY hsgpa_subj_code ) / COUNT(CASE WHEN hsgpa_subj_code='FL' THEN a.szrhstr_grade END) OVER (PARTITION BY hsgpa_subj_code ORDER BY hsgpa_subj_code), 2) as "ForeignLang_GPA"
FROM TT_STUDENT.TT_ST_SZRHSTR a
JOIN tt_student.tt_st_hsgpa_code ON a.szrhstr_tea_cse_code LIKE hsgpa_tea_code
WHERE NOT EXISTS 
  (SELECT * FROM tt_student.tt_st_hsgpa WHERE hsgpa_pidm = a.szrhstr_pidm and trunc(hsgpa_activity_date) >= trunc(a.szrhstr_activity_date))
  AND decode(REGEXP_INSTR (a.szrhstr_grade, '[^[:digit:]]'),0,'NUMBER','NOT_NUMBER') = 'NUMBER'
  and szrhstr_pidm = 119;

只需使用
groupby
和聚合函数。类似的方法可能会奏效:

SELECT a.szrhstr_pidm AS PIDM, 
       a.szrhstr_hs_code AS HS_Code, 
       a.szrhstr_activity_date,
       AVG(CASE WHEN hsgpa_subj_code = 'SCI' THEN a.szrhstr_grade END as "Science_GPA", 
       AVG(CASE WHEN hsgpa_subj_code = 'ENG' THEN a.szrhstr_grade END) as "English_GPA",
       AVG(CASE WHEN hsgpa_subj_code = 'MATH' THEN a.szrhstr_grade END) as "Math_GPA",
       AVG(CASE WHEN hsgpa_subj_code = 'SOC' THEN a.szrhstr_grade END) as "History_GPA",
       ROUND(AVG(CASE WHEN hsgpa_subj_code = 'FL' THEN a.szrhstr_grade END), 2) as "ForeignLang_GPA"
FROM TT_STUDENT.TT_ST_SZRHSTR a JOIN
     tt_student.tt_st_hsgpa_code
     ON a.szrhstr_tea_cse_code = hsgpa_tea_code
WHERE NOT EXISTS 
  (SELECT * FROM tt_student.tt_st_hsgpa WHERE hsgpa_pidm = a.szrhstr_pidm and trunc(hsgpa_activity_date) >= trunc(a.szrhstr_activity_date))
  AND decode(REGEXP_INSTR (a.szrhstr_grade, '[^[:digit:]]'),0,'NUMBER','NOT_NUMBER') = 'NUMBER'
  and szrhstr_pidm = 119
GROUP BY a.szrhstr_pidm, a.szrhstr_hs_code, a.szrhstr_activity_date;

我发誓我已经试过了。当我复制并粘贴你的时,它是有效的,但我自己取消对GROUPBY的注释是失败的。谢谢,感谢您的帮助。您必须将“选择”中的函数更改为“聚合”函数。它不适用于使用主题代码进行分区的分析函数。我现在明白为什么了,但我不认为我自己能解决这个问题。谢谢你,我真的学到了一些东西。