sql - 我可以强制此 Oracle 窗口查询返回单行值吗?

标签 sql oracle aggregate-functions analytic-functions

此查询旨在替换另一个使用嵌套子查询并相应执行的查询。就像现在一样,它确实为每列返回正确的结果,但将返回具有该列的值的行,其余为空,然后返回另一行,其中第二列中包含第二个值,其余为空,等等。使其成为“选择不同”有助于将 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/

相关文章:

mysql - 如何将数据库中不存在的任意值添加到 MySQL SELECT 中的选定行?

php - 如何将 SQL 表中的行列出到 jquery 脚本中?

java - H2数据库是否兼容Oracle 'Insert All'语句?

sql - ORACLE 上棘手的 GROUP BY 问题

sql-server - 在 SQL Server 中查询最小值比查询所有行要长很多

mysql - 在 select 语句中使用 IF 逐月对值进行分组

sql - 如何在 SQL Server 2008 中最好地进行部分文本匹配

sql - 在sql中的关键字后从文本中提取字符串?

java - eclipse-link上可以安装oracle驱动吗?或者在 Glassfish 里?或在哪里以及如何?

mysql - SQL 仅选择列上具有最大值的行