#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