对某个值进行分组,以便下一行的空值位于上一行
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
是否有任何解决方法可以删除要取消分组的分组列?我想将数据从 合并到具有相似数据但不同等级的行
这是我的代码:
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