Не удается отфильтровать необходимые данные

#sql-server

Вопрос:

Привет, у меня есть ученик с 1 таблицей, где данные вставляются по строкам, и я хочу выбрать только тех учеников, чьи отметки превышают 50% по всем предметам, и если в каком-либо предмете отметки меньше 50%, то он не должен выбирать этого ученика в выводе, и все записи должны быть исключены для этого ученика, и нет первичного ключа

я попробовал код ниже :

 Select * into #temp1 from  Student  where percent >=0.5 and group by Roll_Number
 

я получаю ошибку :

недопустимо в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY.

и если попробовать вот так :

 Select * into #temp1 from  Student  where percent >=0.5
 

тогда я получаю студентов, у которых даже по 1 предмету более 50%, что не требуется при выводе

Структура таблицы выглядит следующим образом

 Student_Name   Roll_Number   Subject  Marks  Percent 
Ashutosh        1234         English  40     40% 
Ishan           1231         Maths    60     60% 
Atul            1232         Maths    30     30% 
Ashutosh        1234         MAths    70     70% 
 

теперь на выходе он должен давать только

 Ishan          1234        Maths     60     60% 




 

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

1. Указание нам, что «не требуется», не помогает определить, что требуется. Итак, каковы ваши требования? Вы хотите выбрать все строки для тех студентов, у которых минимальное значение «процент» составляет не менее 0,5 для каждой строки в этой таблице? Или, может быть, вы хотите основать это в среднем на всех строках для студента? Используя среднюю логику, Ашутош также был бы включен.

Ответ №1:

Вы можете использовать count() over() для того, чтобы указать для каждого учащегося, есть ли в какой-либо строке:

 with s as (
    select *,
      Count(case when perc<0.5 then 1 end) over(partition by Student_Name) pc
    from Students
)
select *
from s
where Percent>=0.5 and pc=0
 

Ответ №2:

Вы можете получить желаемый результат, используя подзапрос / cte и функцию окна, чтобы проверить, набрал ли студент не менее 50% по всем предметам:

 DECLARE @Student TABLE(
Student_Name VARCHAR(20)
,Roll_Number int
,Subject VARCHAR(20)
,Marks int
,Perc DECIMAL(5,2)
)

INSERT INTO @Student VALUES
 ('Ashutosh',1234,'English',40,0.4)
,('Ishan',1231,'Maths',60,0.6)
,('Atul',1232,'Maths',30,0.3)
,('Ashutosh',1234,'Maths',70,0.7);

WITH cteFilter AS(
  SELECT *, ROW_NUMBER() OVER (PARTITION BY Student_Name, Roll_Number ORDER BY Perc ASC, Marks ASC) rn
    FROM @Student
)
SELECT *
  FROM cteFilter
  WHERE rn = 1
    AND Perc >= 0.5