Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > Запрос с группировкой


Автор: pelikesha 13.6.2012, 15:58
Здравствуйте, прошу помощи в составлении SQL запроса

Таблица: 

id_r id_p summ mark 
001  001   16   2
001  002   15   3
001  003   14   4
002  001   13   3
002  002   16   3
002  003   13   5
002  004   14   3
003  001   16   5
003  002   13   4
003  003   11   5
003  004   16   3
003  005   14   4


Требуемый результат:

id_r avg_summ kol 3 
001      15     1
002      14     4
003      14     1


Т.е. сгруппировав по id_r, посчитать среднее значение по столбцу summ, а так же количество человек внутри этого id_r  с оценкой (mark=3). Сейчас у меня реализованы лишь первые два столбца таблицы:

Код

SELECT table.id_r, avg(table.summ) as avg_summ FROM table GROUP BY table.id_r;


А вот как добавить количество строк, удовлетворяющих условию - не понимаю... Все попытки были безуспешны.
Заранее благодарю за помощь! 

Автор: Akina 13.6.2012, 16:23
Цитата(pelikesha @  13.6.2012,  16:58 Найти цитируемый пост)
как добавить количество строк, удовлетворяющих условию - не понимаю

Код

sum(case when mark=3 then 1 else 0 end)

Автор: Zloxa 13.6.2012, 16:24
Цитата(pelikesha @  13.6.2012,  16:58 Найти цитируемый пост)
количество человек внутри этого id_r  с оценкой (mark=3)

count(/*distinct ?*/ case when mark=3 then id_p end)

Автор: pelikesha 13.6.2012, 16:51
Akina, спасибо, отписал вам в ЛС... К сожалению выдало ошибку синтаксиса(
Zloxa, не совсем понял вашу запись :(

Автор: Данкинг 13.6.2012, 16:56
Цитата(pelikesha @  13.6.2012,  17:51 Найти цитируемый пост)
К сожалению выдало ошибку синтаксиса

А СУБД какая?

Автор: Zloxa 13.6.2012, 17:11
Цитата(pelikesha @  13.6.2012,  17:51 Найти цитируемый пост)
 не совсем понял вашу запись :( 

Я предположил что id_p идентифицирует человека. Вам ведь человеков нужно посчитать, а не записи оценок? ничто не указывает на то, что пара (id_r,id_p) является уникальной. По этой причине, на всякий случай, закоментировал distinct, который следует раскоментировать, если в группе по id_r может быть упомянут несколько раз один человек с оценкой равной три, но посчитаться эти несколько записей должны как одна. По этой же причине используется count а не sum. Count считает не null значения. Если условие в case не вернет истину, значение в count окажется не определенным и не будет посчитано.

upd
Методика, предложенная Akina посчитает оценки а не человеков. В случае, если человеки не могут быть не определены и пара (человек, оценка) в пределах группы уникальны, это значение будет совпадать с количеством человеков. smile 

Автор: Akina 13.6.2012, 17:19
Цитата(pelikesha @  13.6.2012,  17:51 Найти цитируемый пост)
отписал вам в ЛС... 

Больше так не делайте - нарвётесь на пожизненный игнор.

Автор: pelikesha 13.6.2012, 18:34
Цитата(Данкинг @ 13.6.2012,  16:56)
Цитата(pelikesha @  13.6.2012,  17:51 Найти цитируемый пост)
К сожалению выдало ошибку синтаксиса

А СУБД какая?
Да, сразу не указал, не бейте сильно... MS Access
Цитата
Методика, предложенная Akina посчитает оценки а не человеков. В случае, если человеки не могут быть не определены и пара (человек, оценка) в пределах группы уникальны, это значение будет совпадать с количеством человеков.
Спасибо, понял. Нужно посчитать оценки. 
Цитата
Больше так не делайте - нарвётесь на пожизненный игнор.
Извините... smile 

Автор: Данкинг 13.6.2012, 20:31
Цитата(pelikesha @  13.6.2012,  19:34 Найти цитируемый пост)
Да, сразу не указал, не бейте сильно... MS Access

Правильно, откуда там CASE всякие.

Автор: Akina 13.6.2012, 21:43
Заменяем CASE на IIF... синтаксис - во встроенной справке

Автор: pelikesha 14.6.2012, 08:07
Цитата(Akina @ 13.6.2012,  21:43)
Заменяем CASE на IIF... синтаксис - во встроенной справке

Огромное спасибо, все получилось. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)