Как выбрать значение в том же состоянии? - PullRequest
2 голосов
/ 16 апреля 2019

Я пытаюсь с помощью SQL-запроса выяснить, сколько студентов изучают 2 предмета в одном семестре.

У меня есть таблица, которая состоит из 3 строк, и я хочу выяснить, какой студент изучал оба предмета «4877» и «4897» в одном семестре. Но я не знаю, как описать «в том же семестре».

student subject semester
1070781 4877    126
1070781 4897    126
1076677 4877    135
1078595 4877    126
1078595 4897    126
1078716 4897    127
1079496 4877    126
1079496 4897    126
1079627 4897    127
1080640 4877    127
...
SELECT student 
FROM table 
WHERE "studied 4877 and 4897 in the same semester";
student
1070781
1078595 
1079496 
...

Ответы [ 3 ]

6 голосов
/ 16 апреля 2019

Вы можете использовать этот запрос:

SELECT studentid, semester
FROM mytable
WHERE subject IN (4877, 4897)
GROUP BY studentid, semester
HAVING COUNT(DISTINCT subject) = 2

Запрос возвращает все студенческие идентификаторы, которые посещали оба предмета по крайней мере в одном семестре.

Примечание: Предложение HAVING использует COUNT DISTINCT вместо простого COUNT, чтобы избежать возврата ложных положительных записей, как в следующем случае:

student subject semester
------------------------
1070781 4877    126
1070781 4877    126
0 голосов
/ 16 апреля 2019

Другое решение заключается в использовании CROSS APPLY

SELECT DISTINCT studentid, semester
FROM yourtable a1
CROSS APPLY (
  SELECT count(distinct a2.subject ) c1
  FROM yourtable a2
  WHERE subject  in (1, 500) and
        a2.studentid = a1.studentid and
        a2.semester = a1.semester
) t
WHERE t.c1 = 2
0 голосов
/ 16 апреля 2019

Следующий запрос протестирован в SQL Server.

 CREATE TABLE #students
(
student bigint,
subject int,
semester int
)
INSERT INTO #students VALUES
(1070781,4877,126),
(1070781,4897,126);

SELECT student
from
(SELECT semester, student, SUM(CASE WHEN subject IN ('4877','4897') THEN 1 ELSE 0 END) as StudiedTwo
from #Students
group by semester, student
) as t
where StudiedTwo = 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...