Страницы

Поиск по вопросам

четверг, 2 января 2020 г.

Подзапрос SELECT

#sql #sql_server #оптимизация


Есть таблица результатов экзаменов по русскому языку и математике:

declare @Results Table
(
    SchoolID nvarchar(200),
    ParticipID nvarchar(200),
    SubjectCode int,
    TestResult5 int 
)

--subjectcode: 1-русский язык, 2-математика

insert into @Results VALUES 
        ('0001', 'Шахабов_Адам', 1, 4),
        ('0001', 'Асвадов_Аюб', 1, 3),
        ('0001', 'Майрукаев_Бекхан', 1, 3),
        ('0001', 'Шахабов_Адам', 2, 3),
        ('0001', 'Асвадов_Аюб', 2, 4),
        ('0001', 'Майрукаев_Бекхан', 2, 5),
        ('0002', 'Цуригова_Зайнап', 2, 5),
        ('0002', 'Майрукаев_Роза', 2, 4),
        ('0002', 'Муциев_Адлан', 2, 3),
        ('0002', 'Цуригова_Зайнап', 1, 3),
        ('0002', 'Майрукаев_Роза', 1, 4),
        ('0002', 'Муциев_Адлан', 1, 5)




Условие: Необходимо извлечь список школ (SchoolID), у которых число участников, получивших
отметку 3 по русскому языку, больше 1.

Как я это делаю:

select schoolid from

       (select schoolid,
       SUM(CASE WHEN subjectcode = 1 and testresult5 = 3 then 1 else 0 end) c
       from @Results       
       group by schoolid) temp_table

       where c > 1




Необходимо: оптимизировать данный запрос. 

Конечно, на этом примере код выглядит не совсем большим. Я специально показал маленький
пример. Все ли правильно я делаю? Можно ли как-то обойтись без подзапроса в этом случае?
    


Ответы

Ответ 1



Вам поможет HAVING: SELECT schoolid, COUNT(ParticipID) FROM @Results WHERE subjectcode = 1 AND testresult5 = 3 GROUP BY schoolid HAVING COUNT(ParticipID) > 1 http://sqlfiddle.com/#!9/fe6b2/1/0 https://ru.wikipedia.org/wiki/Having_(SQL)

Ответ 2



В дополнение к ответу Сергея Водакова Если вам нужно вытащить только schoolid из запроса, то можно написать без count(participid): select r.schoolid from results r where r.subjectcode = 1 and r.testresult5 = 3 group by r.schoolid having count(distinct r.participid) >= 2 sqlfiddle

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

Отправить комментарий