如何在SQL中按值按名称进行grup?

如何在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

我需要使用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 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