Проблема, связанная с подсчетом записи в предложении Group by

#sql-server

#sql-сервер

Вопрос:

У меня есть одна таблица базы данных, имеющая StudentId(int),Subject(varchar(50)),Marks(int),IsPass(int),ExamDate(Datetime)

В таблице может быть более одной записи по одному и тому же предмету для конкретного учащегося на разную дату.

Я написал следующий запрос :

 select StudentId, Count(IsPass) 
from ExamEntry
where IsPass =1  group by StudentId
  

но не хотите, чтобы условие Where в запросе:

возможно, что-то вроде этого :

 Select StudentId, case when IsPass = 1 then count(IsPass) end 
from ExamEntry 
group by studentId
  

но он отображает более одной записи для perticular StudentID

Как я могу достичь своей цели?

Ответ №1:

Ответ настолько прост, что его никто не видел 🙂

 SELECT StudentId, SUM(IsPass) 
FROM ExamEntry GROUP BY StudentId
  

Комментарии:

1. @Remou: хорошая идея. Я не поставил его из-за названия поля (IsPass) и того факта, что в вопросе упоминается «= 1». Я предположил, что это 0 или 1. Похоже, это связано с приложением c #. Я не знаю, что там будет храниться, если привязать к комбо в c #: 1 или -1 для True?

2. Я не уделяю достаточного внимания: (

Ответ №2:

 SELECT StudentId,
       COUNT(CASE WHEN IsPass = 1 THEN 'X' END) AS NumberOfPasses
FROM   ExamEntry
GROUP  BY StudentId  
  

COUNT подсчитывает только NOT NULL значения и CASE имеет неявное ELSE NULL

Ответ №3:

Возможно, вам нужно что-то подобное?

 SELECT StudentId, SUM(CASE WHEN IsPass = 1 THEN 1 ELSE 0 END) AS Number_Of_Passed_Exams
FROM ExamEntry
GROUP BY StudentId
  

Ответ №4:

Если вы не хотите использовать для этого предложение where, то предложение Having является его простейшей альтернативой.

Попробуйте это.

 select StudentId, count(IsPass)AS PassedCount
from ExamEntry
group by StudentId,IsPass
having IsPass= 1