Схема прилагается в конце для тех, кто хочет поиграть.
Запрос
select cs.ClassID, TotalStudent=count(s.StudentID),[PaymentBefore08.09.2019]=count(pB.StudentID), [PaymentAfter08.09.2019]=count(pA.StudentID)
from ClassStudent cs
inner join Students s on cs.StudentID = s.StudentID
left join Payment pA on s.StudentID = pA.StudentID and datediff(day, pA.PaymentTime, '2019-08-09') < 0
left join Payment pB on s.StudentID = pB.StudentID and datediff(day, pB.PaymentTime, '2019-08-09') >= 0
group by cs.ClassID
Выход
Объяснение
Сначала выбирается таблица ClassStudent для получения списка всех классов.
Во-вторых, таблица «Студенты» объединяется для получения общего числа студентов в классе.
В-третьих, в таблицу «Платежи» было сделано два соединения. Один, чтобы получить платежи, сделанные до 08.09.2019, а другой, чтобы получить платеж, сделанный позже.
Наконец, запрос сгруппирован по ClassID, потому что нам нужно отображать его без агрегирования.
Схема
CREATE TABLE Students
([StudentID] int, [Name] varchar(57));
CREATE TABLE ClassStudent
([StudentID] int, [ClassID] int);
CREATE TABLE Payment
([StudentID] int,[PaymentTime] datetime);
INSERT INTO Students values (1, 'Aaa');
INSERT INTO Students values (2, 'Bbb');
INSERT INTO Students values (3, 'Ccc');
INSERT INTO Students values (4, 'Ddd');
INSERT INTO Students values (5, 'Eee');
INSERT INTO Students values (6, 'Fff');
INSERT INTO Students values (7, 'Ggg');
INSERT INTO Students values (8, 'Hhh');
INSERT INTO Students values (9, 'Iii');
INSERT INTO ClassStudent values (1, 1);
INSERT INTO ClassStudent values (2, 2);
INSERT INTO ClassStudent values (3, 3)
INSERT INTO ClassStudent values (4, 1);
INSERT INTO ClassStudent values (5, 2);
INSERT INTO ClassStudent values (6, 3)
INSERT INTO ClassStudent values (7, 1);
INSERT INTO ClassStudent values (8, 2);
INSERT INTO ClassStudent values (9, 3);
INSERT INTO Payment values (1, '2019-08-10');
INSERT INTO Payment values (2, '2019-08-10');
INSERT INTO Payment values (3, '2019-08-09')
INSERT INTO Payment values (4, '2019-08-09');
INSERT INTO Payment values (5, '2019-08-08');
INSERT INTO Payment values (6, '2019-08-07')
INSERT INTO Payment values (7, '2019-08-06');
INSERT INTO Payment values (8, '2019-08-09');
INSERT INTO Payment values (9, '2019-08-09')