powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выбрать группы в которых все студенты получили отлично
38 сообщений из 38, показаны все 2 страниц
Выбрать группы в которых все студенты получили отлично
    #39769341
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В голову приходит что-то подобное:

Код: sql
1.
2.
3.
Select group.id, avg(student.mark) join student ....
group by  group.id
having avg(student.mark) = 5.0



Подскажите есть ли вариант попроще?
...
Рейтинг: 0 / 0
Выбрать группы в которых все студенты получили отлично
    #39769347
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
where not exists( select * from student as x where student.groupid = x.groupid and x.mark < 5.0 )
...
Рейтинг: 0 / 0
Выбрать группы в которых все студенты получили отлично
    #39769349
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner,


есть. ходить на лекции
...
Рейтинг: 0 / 0
Выбрать группы в которых все студенты получили отлично
    #39769364
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222
Код: sql
1.
where not exists( select * from student as x where student.groupid = x.groupid and x.mark < 5.0 )


О, кореллированный подзапрос)
...
Рейтинг: 0 / 0
Выбрать группы в которых все студенты получили отлично
    #39769366
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
felix_ffquestioner,


есть. ходить на лекции


Ну если каждый день не писать подобные запросы, то поверь - забываются эти приёмчики.

P.S. Последний раз был на лекции в 2013 если что. И это были не базы данных
...
Рейтинг: 0 / 0
Выбрать группы в которых все студенты получили отлично
    #39769369
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioneraleks222
Код: sql
1.
where not exists( select * from student as x where student.groupid = x.groupid and x.mark < 5.0 )


О, кореллированный подзапрос)
Ваще то нет.
Не коррелированный.
...
Рейтинг: 0 / 0
Выбрать группы в которых все студенты получили отлично
    #39769372
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222questionerпропущено...

О, кореллированный подзапрос)
Ваще то нет.
Не коррелированный.

А какой?

один студен student внешнего , другой x из внутреннего
...
Рейтинг: 0 / 0
Выбрать группы в которых все студенты получили отлично
    #39769383
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner,

коррелированный что-то должен вернуть. А это - фильтр.
...
Рейтинг: 0 / 0
Выбрать группы в которых все студенты получили отлично
    #39769385
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосовquestioner,

коррелированный что-то должен вернуть. А это - фильтр.

ну я как бы хз, ребят, но

http://www.sql.ru/articles/mssql/2005/032101usingcorrelatedsubquery.shtml Что такое - Коррелированный Подзапрос?

Коррелированный подзапрос - это оператор SELECT, вложенный в другой оператор T-SQL, и ссылающийся на один или несколько столбцов внешнего запроса

Выглядит будто корреллированный подзапрос может быть фильтром
...
Рейтинг: 0 / 0
Выбрать группы в которых все студенты получили отлично
    #39769391
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner,

Коррелированный подзапрос зависит от внешнего. Чего он там возвращает и где расположен - не важно.
...
Рейтинг: 0 / 0
Выбрать группы в которых все студенты получили отлично
    #39769393
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invmquestioner,

Коррелированный подзапрос зависит от внешнего. Чего он там возвращает и где расположен - не важно.

Вот и я про это же. Путают меня местные умники)
...
Рейтинг: 0 / 0
Выбрать группы в которых все студенты получили отлично
    #39769402
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerВ голову приходит что-то подобное:

Код: sql
1.
2.
3.
Select group.id, avg(student.mark) join student ....
group by  group.id
having avg(student.mark) = 5.0




Подскажите есть ли вариант попроще?

Куда уж проще.
...
Рейтинг: 0 / 0
Выбрать группы в которых все студенты получили отлично
    #39769415
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Агнец за бортомquestionerВ голову приходит что-то подобное:

Код: sql
1.
2.
3.
Select group.id, avg(student.mark) join student ....
group by  group.id
having avg(student.mark) = 5.0




Подскажите есть ли вариант попроще?

Куда уж проще.

Это решение плохо масштабируется если например шкала десятибальная, а я хочу найти препода у которого у всех студенты получили 8 балллов ровно.
...
Рейтинг: 0 / 0
Выбрать группы в которых все студенты получили отлично
    #39769417
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
questionerАгнец за бортомпропущено...


Куда уж проще.

Это решение плохо масштабируется если например шкала десятибальная, а я хочу найти препода у которого у всех студенты получили 8 балллов ровно.

Это решение плохо масштабируется если например шкала десятибальная, а я хочу найти группы в которых у всех студентов 8 балллов ровно.
...
Рейтинг: 0 / 0
Выбрать группы в которых все студенты получили отлично
    #39769443
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner,

как вариант тогда еще так:

Код: sql
1.
select gr from @t group by gr having (sum(m%5)=0 and count(1) > 1) or (sum(m)=5 and count(1) = 1)



вариант aleks222 думаю будет быстрее
...
Рейтинг: 0 / 0
Выбрать группы в которых все студенты получили отлично
    #39769483
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerinvmquestioner,

Коррелированный подзапрос зависит от внешнего. Чего он там возвращает и где расположен - не важно.

Вот и я про это же. Путают меня местные умники)
Это тя главный умник путает.
По факту и сути exists реализуется как (inner/outer)join.
...
Рейтинг: 0 / 0
Выбрать группы в которых все студенты получили отлично
    #39769497
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Накатал было телегу, но потом увидел, что ты и есть автор.

Так ты реши, тебе попроще? Или надо найти группы, где все студенты получили максимальный балл, но выше среднего, исключая отсутствующих и совсем безнадёжных.
...
Рейтинг: 0 / 0
Выбрать группы в которых все студенты получили отлично
    #39769508
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner
Код: sql
1.
2.
3.
Select group.id, avg(student.mark) join student ....
group by  group.id
having avg(student.mark) = 5.0


Подскажите есть ли вариант попроще?
Не AVG(), а MIN().

Ну и avg(student.mark) join student - это как-то неэскуэльно.
...
Рейтинг: 0 / 0
Выбрать группы в которых все студенты получили отлично
    #39769511
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerхочу найти группы в которых у всех студентов 8 балллов ровно.
Код: sql
1.
2.
3.
0 = SUM(CASE mark WHEN 8 THEN 0 ELSE 1 END)
-- или там 
0 = COUNT(CASE WHEN mark != 8 THEN 1 END)
...
Рейтинг: 0 / 0
Выбрать группы в которых все студенты получили отлично
    #39769520
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akinaquestionerхочу найти группы в которых у всех студентов 8 балллов ровно.
Код: sql
1.
2.
3.
0 = SUM(CASE mark WHEN 8 THEN 0 ELSE 1 END)
-- или там 
0 = COUNT(CASE WHEN mark != 8 THEN 1 END)


Ну что ты зациклился на группировке?
exists/not exists быстрее.
...
Рейтинг: 0 / 0
Выбрать группы в которых все студенты получили отлично
    #39769532
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222exists/not exists быстрее.Это да. Но в данной предметной области, где в таблицах от силы несколько тысяч записей, а сама база вся целиком легко помещается в память, это неактуально. К тому же из таблицы будет выбираться distinct group.id, но с проверкой по всем записям группы, что не особо и отличается от явной группировки.
А такие конструкции, как я привёл, более понятны на начальных этапах освоения sql.
...
Рейтинг: 0 / 0
Выбрать группы в которых все студенты получили отлично
    #39769550
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По мне так для новичка будет понятнее
Код: sql
1.
Having Min(student.mark) = 5 and Max(student.mark) = 5
...
Рейтинг: 0 / 0
Выбрать группы в которых все студенты получили отлично
    #39769555
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akinaaleks222exists/not exists быстрее.Это да.Легко соглашаетесь.
Наш "дарагуля" очень не любит изучать планы выполнения. Иначе он был бы в курсе, что его любимый exists/not exists может компилироваться в агрегирование с (о ужас!) группировками.
...
Рейтинг: 0 / 0
Выбрать группы в которых все студенты получили отлично
    #39769562
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmЛегко соглашаетесь.Да мне ж не жалко...
...
Рейтинг: 0 / 0
Выбрать группы в которых все студенты получили отлично
    #39769707
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akinaquestionerхочу найти группы в которых у всех студентов 8 балллов ровно.
Код: sql
1.
2.
3.
0 = SUM(CASE mark WHEN 8 THEN 0 ELSE 1 END)
-- или там 
0 = COUNT(CASE WHEN mark != 8 THEN 1 END)



Всегда интересовал вопрос, а нолик в начале, чтобы читать неудобнее было?
...
Рейтинг: 0 / 0
Выбрать группы в которых все студенты получили отлично
    #39769714
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner а я хочу найти препода у которого у всех студенты получили 8 балллов ровно.

Ну так поменять немного

Код: sql
1.
2.
3.
Select group.id, avg(student.mark) join student ....
group by  group.id
having min(student.mark) = 5 and max(student.mark) = 8
...
Рейтинг: 0 / 0
Выбрать группы в которых все студенты получили отлично
    #39769715
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
Select group.id, avg(student.mark) join student ....
group by  group.id
having min(student.mark) = 8 and max(student.mark) = 8
...
Рейтинг: 0 / 0
Выбрать группы в которых все студенты получили отлично
    #39769716
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
туплю

Код: sql
1.
2.
3.
Select group.id, min(student.mark), max(student.mark) join student ....
group by  group.id
having min(student.mark) = 8 and max(student.mark) = 8
...
Рейтинг: 0 / 0
Выбрать группы в которых все студенты получили отлично
    #39769740
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerа нолик в начале, чтобы читать неудобнее было?А какая разница-то? проверка на равенство - штука симметричная. Что же до неудобства - при полном форматировании выравнивают много чего, в т.ч. и операторы сравнения.
...
Рейтинг: 0 / 0
Выбрать группы в которых все студенты получили отлично
    #39769742
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
982183 , а зачем групповые функции в выходной набор-то пихать? тем более что с учётом условия отбора значения этих полей очевидны...
...
Рейтинг: 0 / 0
Выбрать группы в которых все студенты получили отлично
    #39769783
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akinaquestionerа нолик в начале, чтобы читать неудобнее было?А какая разница-то? проверка на равенство - штука симметричная. Что же до неудобства - при полном форматировании выравнивают много чего, в т.ч. и операторы сравнения.

Читать неудобно
...
Рейтинг: 0 / 0
Выбрать группы в которых все студенты получили отлично
    #39769873
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner,

по моей гипотезе так левши пишут, равно как и зеркальные смайлики.
...
Рейтинг: 0 / 0
Выбрать группы в которых все студенты получили отлично
    #39769886
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina 982183 , а зачем групповые функции в выходной набор-то пихать? тем более что с учётом условия отбора значения этих полей очевидны...
Наверное зря.
Поддался на первоначальный текст.
Практики нет лет 20.
навыки уходят.
Но так точно работать будет.
...
Рейтинг: 0 / 0
Выбрать группы в которых все студенты получили отлично
    #39769887
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Простите. всё уже было.

KopellyПо мне так для новичка будет понятнее
Код: sql
1.
Having Min(student.mark) = 5 and Max(student.mark) = 5
...
Рейтинг: 0 / 0
Выбрать группы в которых все студенты получили отлично
    #39769971
andrey odegov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerAkinaпропущено...

Код: sql
1.
2.
3.
0 = SUM(CASE mark WHEN 8 THEN 0 ELSE 1 END)
-- или там 
0 = COUNT(CASE WHEN mark != 8 THEN 1 END)



Всегда интересовал вопрос, а нолик в начале, чтобы читать неудобнее было?
Тяжелое наследие C/C++ :)
В операторе сравнения '==' забывается второй знак '=' и при такой записи компилятор выдает ошибку.
...
Рейтинг: 0 / 0
Выбрать группы в которых все студенты получили отлично
    #39770234
Фотография Разумная кровать
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а вариант с ALL не подойдёт ?
...
Рейтинг: 0 / 0
Выбрать группы в которых все студенты получили отлично
    #39770295
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разумная кровать,

подойдет. кстати вариант алекса не очень универсален если расширять шкалу оценок

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
declare @t table (
id int identity(1,1), 
gr int,
mark int,
index ix (gr, mark)
)

insert into @t values ( 1, 5), ( 1, 3), (2, 5), (3, 4), (3, 2), (4, 5), (4,5), (6, 8), (7,8), (7,10)
set statistics io, time on
print 'ALL:'
select gr from @t t0 where 8 = all(select mark from @t t where t.gr = t0.gr) group by gr
print 'MIN+MAX:'
select gr from @t t0 group by gr having min(mark) = 8 and max(mark) = 8
print 'SUM+COUNT:'
select gr from @t group by gr having (sum(mark%8)=0 and count(1) > 1) or (sum(mark)=8 and count(1) = 1)
print 'SUM+CASE'
select gr from @t t0 group by gr having 0 = SUM(CASE mark WHEN 8 THEN 0 ELSE 1 END)
print 'ALEX:'
select gr from @t t0 where not exists( select * from @t t where t.gr = t0.gr and t.mark < 8 )
set statistics io, time off




ALL:

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
Table '#ADE7C60A'. Scan count 11, logical reads 22, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
MIN+MAX:

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
Table '#ADE7C60A'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
SUM+COUNT:

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
Table '#ADE7C60A'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
SUM+CASE

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
Table '#ADE7C60A'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
ALEX:

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
Table '#ADE7C60A'. Scan count 11, logical reads 22, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.

...
Рейтинг: 0 / 0
Выбрать группы в которых все студенты получили отлично
    #39770482
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
having sum(mark%@ИскомаяОценка)=0


Условие некорректное: при @ИскомаяОценка = 2 истина для всех четных оценок. При @ИскомаяОценка = 1 - для всех целых.
...
Рейтинг: 0 / 0
38 сообщений из 38, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выбрать группы в которых все студенты получили отлично
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]