此查询旨在替换另一个使用嵌套子查询并相应执行的查询。就像现在一样,它确实为每列返回正确的结果,但将返回具有该列的值的行,其余为空,然后返回另一行,其中第二列中包含第二个值,其余为空,等等。使其成为“选择不同”有助于将 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;
最佳答案
只需使用group by
和聚合函数。像这样的东西可能会起作用:
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;
关于sql - 我可以强制此 Oracle 窗口查询返回单行值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24872520/