对某个值进行分组,以便下一行的空值位于上一行

Group a certain value so that the null values on next row would be on previous row

是否有任何解决方法可以删除要取消分组的分组列?我想将数据从 合并到具有相似数据但不同等级的行

这是我的代码:

SELECT DISTINCT
            (decode(replace(encode((rc.logo_web),'escape')::text,E'2',''),'base64')) as school_logo,
            cs.name as student_name,
            (SELECT (concat (cs.prev_glevel_name, ' - ' , cs.prev_section))) as grade_section,
            cs.lrn,
            (SELECT
                (CASE
                    WHEN grss.term = 1
                    THEN ROUND(grsf.final_grade)
                    END)) as d1,
            (SELECT
                (CASE
                    WHEN (SELECT ROUND(grsf.final_grade) WHERE grss.term = 1) >= 90 THEN 'A'
                    WHEN (SELECT ROUND(grsf.final_grade) WHERE grss.term = 1) >= 85 THEN 'P'
                    WHEN (SELECT ROUND(grsf.final_grade) WHERE grss.term = 1) >= 80 THEN 'AP'
                    WHEN (SELECT ROUND(grsf.final_grade) WHERE grss.term = 1) >= 75 THEN 'D'
                    WHEN (SELECT ROUND(grsf.final_grade) WHERE grss.term = 1) < 75 THEN 'B'
                    END)) as l1,
            (SELECT
                (CASE
                    WHEN grss.term = 2
                    THEN ROUND(grsf.final_grade)
                    END)) as d2,
            (SELECT
                (CASE
                    WHEN (SELECT ROUND(grsf.final_grade) WHERE grss.term = 2) >= 90 THEN 'A'
                    WHEN (SELECT ROUND(grsf.final_grade) WHERE grss.term = 2) >= 85 THEN 'P'
                    WHEN (SELECT ROUND(grsf.final_grade) WHERE grss.term = 2) >= 80 THEN 'AP'
                    WHEN (SELECT ROUND(grsf.final_grade) WHERE grss.term = 2) >= 75 THEN 'D'
                    WHEN (SELECT ROUND(grsf.final_grade) WHERE grss.term = 2) < 75 THEN 'B'
                    END)) as l2,
            (SELECT
                (CASE
                    WHEN grss.term = 3
                    THEN ROUND(grsf.final_grade)
                    END)) as d3,
            (SELECT
                (CASE
                    WHEN (SELECT ROUND(grsf.final_grade) WHERE grss.term = 3) >= 90 THEN 'A'
                    WHEN (SELECT ROUND(grsf.final_grade) WHERE grss.term = 3) >= 85 THEN 'P'
                    WHEN (SELECT ROUND(grsf.final_grade) WHERE grss.term = 3) >= 80 THEN 'AP'
                    WHEN (SELECT ROUND(grsf.final_grade) WHERE grss.term = 3) >= 75 THEN 'D'
                    WHEN (SELECT ROUND(grsf.final_grade) WHERE grss.term = 3) < 75 THEN 'B'
                    END)) as l3,
            (SELECT
                (CASE
                    WHEN grss.term = 4
                    THEN ROUND(grsf.final_grade)
                    END)) as d4,
            (SELECT
                (CASE
                    WHEN (SELECT ROUND(grsf.final_grade) WHERE grss.term = 4) >= 90 THEN 'A'
                    WHEN (SELECT ROUND(grsf.final_grade) WHERE grss.term = 4) >= 85 THEN 'P'
                    WHEN (SELECT ROUND(grsf.final_grade) WHERE grss.term = 4) >= 80 THEN 'AP'
                    WHEN (SELECT ROUND(grsf.final_grade) WHERE grss.term = 4) >= 75 THEN 'D'
                    WHEN (SELECT ROUND(grsf.final_grade) WHERE grss.term = 4) < 75 THEN 'B'
                    END)) as l4,
            csy.name as year,
            csy.principal,
            grss.term,
            ct.name as adviser,
            csu.name as subject,
            csu.sequence
        FROM config_student cs
        left join grade_record_score_summary grss on grss.grade_level_id = cs.prev_glevel and grss.section_id = cs.prev_section_id --and grss.is_deportment = False
        left join grade_record_score_final grsf on grsf.summary_id = grss.id and grsf.student_id = cs.id
        left join config_school_year csy on csy.id = grss.school_year
        left join config_period cp on cp.id = grss.term
        left join config_subject csu on csu.id = grss.subject_id
        left join grade_record_score_final_average grsfa on grsfa.student_id = cs.id
        left join config_class_list ccl on ccl.grade_level = cs.prev_glevel and ccl."section" = cs.prev_section_id
        left join config_teacher ct on ct.res_user = ccl.adviser
        left join res_company rc on rc.id = 1
        WHERE cs.id = ${student_id} and csy.id = ${year} and grsf.summary_id is not null and csu.name is not null and csu.sequence != 1000
        GROUP BY student_name, school_logo, cs.prev_glevel_name, cs.prev_section, cs.lrn, ct.name, subject, csu."sequence", grsf.final_grade, grsf.summary_id, year, grss.term, csy.principal, grsfa.final_grade
        ORDER BY csu.sequence ASC

它的输出是这样的

school_logo student_name grade_section lrn d1 l1 d2 l2 d3 l3 d4 l4 year principal adviser subject sequence
example student name grade section lrn 93 A null null null null null null 2020-2021 principal adviser subject sequence
example student name grade section lrn null null 80 AP null null null null 2020-2021 principal adviser subject sequence

而且我想这样转

school_logo student_name grade_section lrn d1 l1 d2 l2 d3 l3 d4 l4 year principal adviser subject sequence
example student name grade section lrn 93 A 80 AP null null null null 2020-2021 principal adviser subject sequence

第一行和第二行的成绩将合并为一行,知道怎么做吗?我试图通过删除 GROUP BY 上的 grss.term 来合并它们,但它会发送错误。这种或不同的方法有什么解决方法吗? 提前致谢

您可以对现有查询进一步使用 group by,如下所示:

Select school_logo,
       student_name,
       grade_section,
       lrn,
       year,
       principal,
       adviser,
       subject,
       sequence,
       Max(d1) as d1,
       Max(l1) as l1,
       Max(d2) as d2,
       Max(l2) as l2,
       .......
  From (your_query) t
Group by school_logo,
         student_name,
         grade_section,
         lrn,
         year,
         principal,
         adviser,
         subject,
         sequence