如何 return 每门课程只有一行
How to return only one row per course
我正在尝试 return 包含三个组成部分的课程 ID 列表:作业、讨论和教学大纲。我希望我的结果每个课程 ID 只有一行,其中 Y 或 N 表示这些课程是否有作业、讨论和教学大纲。但是,对于给定的课程 ID,我得到了 Y 和 N 的每个唯一组合。
如何 return 每个课程 ID 只有一行?
select distinct cm.course_id as Course,
case
when exists (select 1 where gt.name ilike 'Assignment%')
then 'Y'
else 'N'
end as are_there_assignments,
case
when exists (select 1 where gt.name ilike 'Discussion%')
then 'Y'
else 'N'
end as are_there_discussions,
case
when exists (select 1 where ct.label ilike '%syllabus%' )
then 'Y'
else 'N'
end as is_there_a_syllabus
from course_main cm
left join course_course cc
on cm.pk1 = cc.crsmain_pk1
inner join gradebook_main gm
on cm.pk1 = gm.crsmain_pk1
inner join gradebook_type gt
on gm.gradebook_type_pk1 = gt.pk1
inner join course_toc ct
on cm.pk1 = ct.crsmain_pk1
where cc.crsmain_parent_pk1 is NULL
and (cm.course_id ilike '%SPF-2020-C%'
or cm.course_id ilike '%SPF-2020-S%'
or cm.course_id ilike '%SP2-2020-C%'
or cm.course_id ilike '%SP2-2020-S%'
or cm.course_id ilike '%SP2-2020-A%'
or cm.course_id ilike '%SPF-2020-A%')
order by cm.course_id;
这是我目前的结果:
我认为您可以进行条件聚合。从您现有的查询开始,它看起来像:
select
cm.course_id,
max(case when gt.name ilike 'Assignment%' then 'Y' else 'N' end) are_there_assignments,
max(case when gt.name ilike 'Discussion%' then 'Y' else 'N' end) are_there_discussions,
max(case when ct.label ilike '%syllabus%' then 'Y' else 'N' end) is_there_a_syllabus
from ...
where ...
group by cm.course_id
order by cm.course_id
我正在尝试 return 包含三个组成部分的课程 ID 列表:作业、讨论和教学大纲。我希望我的结果每个课程 ID 只有一行,其中 Y 或 N 表示这些课程是否有作业、讨论和教学大纲。但是,对于给定的课程 ID,我得到了 Y 和 N 的每个唯一组合。
如何 return 每个课程 ID 只有一行?
select distinct cm.course_id as Course,
case
when exists (select 1 where gt.name ilike 'Assignment%')
then 'Y'
else 'N'
end as are_there_assignments,
case
when exists (select 1 where gt.name ilike 'Discussion%')
then 'Y'
else 'N'
end as are_there_discussions,
case
when exists (select 1 where ct.label ilike '%syllabus%' )
then 'Y'
else 'N'
end as is_there_a_syllabus
from course_main cm
left join course_course cc
on cm.pk1 = cc.crsmain_pk1
inner join gradebook_main gm
on cm.pk1 = gm.crsmain_pk1
inner join gradebook_type gt
on gm.gradebook_type_pk1 = gt.pk1
inner join course_toc ct
on cm.pk1 = ct.crsmain_pk1
where cc.crsmain_parent_pk1 is NULL
and (cm.course_id ilike '%SPF-2020-C%'
or cm.course_id ilike '%SPF-2020-S%'
or cm.course_id ilike '%SP2-2020-C%'
or cm.course_id ilike '%SP2-2020-S%'
or cm.course_id ilike '%SP2-2020-A%'
or cm.course_id ilike '%SPF-2020-A%')
order by cm.course_id;
这是我目前的结果:
我认为您可以进行条件聚合。从您现有的查询开始,它看起来像:
select
cm.course_id,
max(case when gt.name ilike 'Assignment%' then 'Y' else 'N' end) are_there_assignments,
max(case when gt.name ilike 'Discussion%' then 'Y' else 'N' end) are_there_discussions,
max(case when ct.label ilike '%syllabus%' then 'Y' else 'N' end) is_there_a_syllabus
from ...
where ...
group by cm.course_id
order by cm.course_id