Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 EXISTS  [new]
anton333
Member

Откуда:
Сообщений: 2
Всем привет, не могу понять как заменять агрегатные значения в EXISTS.

Напишите запрос EXISTS, выводящий кол-во студентов каждого курса, которые успешно
сдали экзамены, и при этом не получивших ни одной двойки.
SELECT A.COURSE,COUNT( A.COURSE)
FROM STUDENTS A
Group BY A.COURSE
Having Exists (
SELECT *
FROM EXAM_MARKS B
WHere B.MARK<>2);
1 задания сделал, так , но кажется, что не правильно, нужно что бы было все в EXISTS


А вот со вторым совсем беда, не знаю, как сделать подсчет макс значений и их сравнения...
Напишите запрос EXISTS на выдачу названий предметов обучения,
по которым было получено максимальное кол-во оценок.
24 сен 15, 20:20    [18192111]     Ответить | Цитировать Сообщить модератору
 Re: EXISTS  [new]
Doctormom
Member

Откуда:
Сообщений: 48
anton333,

SELECT A.COURSE,COUNT( A.COURSE)
FROM STUDENTS A
where not exists (select * from EXAMS_MARKS B where B.MArk = 2 and  B.StudentID = A.ID)
Group BY A.COURSE



Может как то так..
24 сен 15, 21:23    [18192374]     Ответить | Цитировать Сообщить модератору
 Re: EXISTS  [new]
anton333
Member

Откуда:
Сообщений: 2
Большое спасибо, не знал что так можно))

SELECT C.NAME,A.SUBJ_ID,Count(A.Mark)
FROM Exam_Marks A,Subjects C
where A.SUBJ_ID=C.ID AND exists (select * from Subjects B Where A.SUBJ_ID=B.ID)
Group BY C.NAME ,A.SUBJ_ID
Сделал 2 задание, но у меня вышло так, что EXIStS у меня, лишь для того, что бы был. Можно ли как то сделать по-другому.
24 сен 15, 23:51    [18192754]     Ответить | Цитировать Сообщить модератору
 Re: EXISTS  [new]
Nicks
Member

Откуда:
Сообщений: 124
anton333, во втором задании у вас нет проверки на максимум в запросе
24 сен 15, 23:59    [18192765]     Ответить | Цитировать Сообщить модератору
 Re: EXISTS  [new]
Jaffar
Member

Откуда:
Сообщений: 633
Nicks,


with ties - используется в связке с order by
select top 1 with ties predmet, count(1) CNT
from TTT
group by predmet
order by CNT desc 
25 сен 15, 08:04    [18192985]     Ответить | Цитировать Сообщить модератору
 Re: EXISTS  [new]
Jaffar
Member

Откуда:
Сообщений: 633
Jaffar,

автор
Напишите запрос EXISTS на выдачу названий предметов обучения,
по которым было получено максимальное кол-во оценок.


это же извращение - писать ЭТО через exists
так даже руки писать не хотят.
Передайте преподу(т.е. иейте в виду для себя) - что ЭТА задачка с т.з. обучения навыкам написания запросов на t-sql - полное говно.
НО, никуда не денешься - задачи преподов надо решать как бы там ни было.

МОжно еще вот так.
select t.predmet, t.COunt
from (select top 1 count(1) MAX_COunt
      from TTT -- табл. сдачи экз.
      group by predmet
      order by MAX_COunt desc) tp
join (select predmet, count(1)COunt
      from TTT -- табл. сдачи экз.
      group by predmet ) t on t.COunt = tp.MAX_COunt




Самое главное понять принципы построения запросов, тогда все станет понятно, а судя по всему вам этого препод и не дает.

Я когда учился - тоже нихрена не понимал как строит эти "гребаные запросы" - потом на работе разобрался.
25 сен 15, 08:16    [18193001]     Ответить | Цитировать Сообщить модератору
 Re: EXISTS  [new]
o-o
Guest
[quot anton333
SELECT C.NAME,A.SUBJ_ID,Count(A.Mark)
FROM Exam_Marks A,Subjects C
where A.SUBJ_ID=C.ID AND exists (select * from Subjects B Where A.SUBJ_ID=B.ID)
Group BY C.NAME ,A.SUBJ_ID
Сделал 2 задание, но у меня вышло так, что EXIStS у меня, лишь для того, что бы был. Можно ли как то сделать по-другому.[/quot]
могу предложить следующий изврат:
declare @Subjects table (id int, name varchar(100));
insert into @Subjects values (1, 'subj1'), (2, 'subj2'), (3, 'subj3');

declare @Exam_Marks table (SUBJ_ID int, Mark int);
insert into @Exam_Marks values (1, 2), (1, 3), (1, 4),
(2, 2), (2, 3), (2, 4), (3, 2);

with cte as 
(
select SUBJ_ID, COUNT(*) cnt
from @Exam_Marks
group by SUBJ_ID
)

SELECT s.NAME
FROM @Subjects s join cte c1 on s.id = c1.SUBJ_ID
and not exists (select * from cte c2 where c1.SUBJ_ID <> c2.SUBJ_ID and c2.cnt > c1.cnt )
---
NAME
subj1
subj2

кстати, ваше решение выводит что-то не то:
SELECT C.NAME,A.SUBJ_ID,Count(A.Mark)
FROM @Exam_Marks A,@Subjects C
where A.SUBJ_ID=C.ID AND exists (select * from @Subjects B Where A.SUBJ_ID=B.ID)
Group BY C.NAME ,A.SUBJ_ID
---
NAME	SUBJ_ID	(No column name)
subj1	1	3
subj2	2	3
subj3	3	1
25 сен 15, 10:03    [18193339]     Ответить | Цитировать Сообщить модератору
 Re: EXISTS  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7871
автор
Напишите запрос EXISTS на выдачу названий предметов обучения,
по которым было получено максимальное кол-во оценок.


При таком условии не будет несколько предметов, т.к. максимум всегда один среди любого количества предметов. Несколько максимумов может быть только, если предметы разбиты на группы.
25 сен 15, 11:06    [18193725]     Ответить | Цитировать Сообщить модератору
 Re: EXISTS  [new]
o-o
Guest
Владислав Колосов
автор
Напишите запрос EXISTS на выдачу названий предметов обучения,
по которым было получено максимальное кол-во оценок.


При таком условии не будет несколько предметов, т.к. максимум всегда один среди любого количества предметов. Несколько максимумов может быть только, если предметы разбиты на группы.

какие группы?
в моем примере как раз по 2-ум предметам такой максимум.
всего 3 предмета, по двум из них получено 3 оценки,
по третьему всего одна.
в ответе 2 предмета, все честно
25 сен 15, 11:30    [18193916]     Ответить | Цитировать Сообщить модератору
 Re: EXISTS  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7871
o-o,

а, with ties.
25 сен 15, 11:40    [18193998]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить