如何在SQL中按值按名称进行grup?
我需要使用SQL和make from:如何在SQL中按值按名称进行grup?,sql,Sql,我需要使用SQL和make from: Student | Subject alpha |Geo alpha| Maths beta |Maths beta | Geo gamma |PE delta |Maths alpha | Pe 输出:贝塔 哪个学生有地理数学,但没有体育?你可以使用聚合和having: select student from t group by student having sum(case when subject = 'Geo' then 1 else
Student | Subject
alpha |Geo
alpha| Maths
beta |Maths
beta | Geo
gamma |PE
delta |Maths
alpha | Pe
输出:贝塔
哪个学生有地理数学,但没有体育?你可以使用聚合和
having
:
select student
from t
group by student
having sum(case when subject = 'Geo' then 1 else 0 end) > 0 and
sum(case when subject = 'Maths' then 1 else 0 end) > 0 and
sum(case when subject = 'PE' then 1 else 0 end) = 0;
一种方法是使用LISTAGG形成每个学生所选科目的列表,然后确定您所关心的科目是否在列表中。比如:
SELECT STUDENT
FROM (SELECT STUDENT,
LISTAGG(SUBJECT, ',') WITHIN GROUP (ORDER BY STUDENT) AS SUBJECTS
FROM STUDENTS
GROUP BY STUDENT)
WHERE INSTR(SUBJECTS, 'Geo') <> 0 AND
INSTR(SUBJECTS, 'Maths') <> 0 AND
INSTR(SUBJECTS, 'Pe') = 0
WITH cteGeo_students
AS (SELECT STUDENT
FROM STUDENTS
WHERE SUBJECT = 'Geo'),
cteMaths_students
AS (SELECT STUDENT
FROM STUDENTS
WHERE SUBJECT = 'Maths'),
ctePe_students
AS (SELECT STUDENT
FROM STUDENTS
WHERE SUBJECT = 'Pe')
SELECT g.STUDENT
FROM cteGeo_students g
INNER JOIN cteMaths_students m
ON m.STUDENT = g.STUDENT
LEFT OUTER JOIN ctePe_students p
ON p.STUDENT = g.STUDENT
WHERE p.STUDENT IS NULL