Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как сформировать запрос / 8 сообщений из 8, страница 1 из 1
23.07.2015, 14:32:23
    #39014491
Как сформировать запрос
Добрый день! Не знаю, как написать запрос с группировкой. Есть таблица с оценками учеников:
-------------------------
Familia ball (Оценка)
Иванов 5
Петров 4
Сидоров 5
Иванов 3
Петров 5
Сидоров 4
Иванов 3
Петров 3
Сидоров 4
Иванов 5
Петров 4
-------------------------
Мой запрос ниже формирует группировку из двух столбцов (сколько пятерок получил каждый):
select Familia, count(ball) as ball_5
from table where ball=5
group by Familia
-------------------------
Нужен запрос который возвращает таблицу из четырех столбцов (сколько пятерок, четверок и троек получил каждый):
То есть, нужно получить такой результат:
-------------------------
Familia ball_5(Кол-во "5") ball_4(Кол-во "4") ball_3(Кол-во "3")
Иванов 2 0 2
Петров 1 2 1
Сидоров 1 2 0
-------------------------
Как это сделать? Пока приходит только такая комбинация:

select t.Familia,
(select count(ball) from table t2 where t2.ball=5 and t2.Familia =t.Familia ) as ball_5,
(select count(ball) from table t2 where t2.ball=4 and t2.Familia =t.Familia ) as ball_4,
(select count(ball) from table t2 where t2.ball=3 and t2.Familia =t.Familia ) as ball_3
from table t group by Familia

Кто нибудь знает оптимальное решение? Спасибо за ответы!
...
Рейтинг: 0 / 0
23.07.2015, 16:21:49
    #39014680
Как сформировать запрос
вот еще второе решение (но не во всех СУБД такое возможно)
------------------------------------
select b5.Familia, b5.ball_5, b4.ball_4, b3.ball_3
from
(select Familia, count(ball) as ball_5 from table where ball=5 group by Familia ) as b5,
(select Familia, count(ball) as ball_4 from table where ball=4 group by Familia ) as b4,
(select Familia, count(ball) as ball_3 from table where ball=3 group by Familia ) as b3
where b5.Familia =b4.Familia and b5.Familia=b3.Familia
...
Рейтинг: 0 / 0
23.07.2015, 16:39:20
    #39014718
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сформировать запрос
чем проще тем лучше
SELECT t.Familia , SUM(t.ball = 5), SUM(t.ball = 4), SUM(t.ball = 3) FROM test t GROUP BY t.Familia
...
Рейтинг: 0 / 0
01.08.2015, 21:31:08
    #39021050
Как сформировать запрос
Alex_Ustinov, Вы ответили на мой вопрос, спасибо! Я не думал про такую конструкцию! Работает!
...
Рейтинг: 0 / 0
02.08.2015, 08:45:49
    #39021102
Как сформировать запрос
Alex_Ustinov, вы писали:
чем проще тем лучше
SELECT t.Familia , SUM(t.ball = 5), SUM(t.ball = 4), SUM(t.ball = 3) FROM test t GROUP BY t.Familia
Получаем количество пятерок, четверок и троек для каждого ученика.

А как изменить этот запрос, чтобы получить сумму пятерок, четверок и троек для каждого ученика?
-------------------------------------
То есть, например Иванов имеет две пятерки, ни одной четверки, четыре тройки. Результат после запроса такой:
Фамилия--(Сумма всех 5)--(Сумма всех 4)--(Сумма всех 3)
Иванов---10---0---12
-------------------------------------
Мое громоздкое решение такое:

select b5.Familia, b5.ball_5, b4.ball_4, b3.ball_3
from
(select Familia, sum(ball) as ball_5 from table where ball=5 group by Familia ) as b5,
(select Familia, sum(ball) as ball_4 from table where ball=4 group by Familia ) as b4,
(select Familia, sum(ball) as ball_3 from table where ball=3 group by Familia ) as b3
where b5.Familia =b4.Familia and b5.Familia=b3.Familia
-------------------------------------
Возможно и здесь есть элегантное решение?!
...
Рейтинг: 0 / 0
02.08.2015, 09:23:20
    #39021108
Как сформировать запрос
Получается, что здесь можно написать так:
SELECT t.Familia , (SUM(t.ball = 5)*5), (SUM(t.ball = 4)*4), (SUM(t.ball = 3)*3) FROM test t GROUP BY t.Familia

Здесь все понятно, теперь вот запрос посложнее на ту же тему:

Есть таблица:
Familia--Time(сек.)--Status
Иванов--10--1
Иванов--25--2
Иванов--20--3
Иванов--13--1
Иванов--40--2
Иванов--18--3
(..Другие фамилии далее..)

Запрос должен показать для каждой фамилии сумму времени (time) всех трех статусов, и выдать такой результат:

Familia--Статус(1)--Статус(2)--Статус(3)
Иванов---23---------65---------38----

Пока вижу такое громоздкое решение:
select s1.Familia, s1.time_1, s2.time_2, s3.time_3
from
(select Familia, sum(time) as time_1 from table where status=1 group by Familia ) as s1,
(select Familia, sum(time) as time_2 from table where status=2 group by Familia ) as s2,
(select Familia, sum(time) as time_3 from table where status=3 group by Familia ) as s3
where s1.Familia =s2.Familia and s1.Familia=s3.Familia

Есть ли вариант попроще?
...
Рейтинг: 0 / 0
02.08.2015, 09:35:32
    #39021109
Как сформировать запрос
Получается, что здесь можно написать так:
SELECT Familia, SUM( (status = 1)*time ), SUM( (status = 2)*time ), SUM((status = 3)*time ) FROM test GROUP BY t.Familia
...
Рейтинг: 0 / 0
03.08.2015, 10:40:33
    #39021485
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сформировать запрос
Код: sql
1.
2.
3.
4.
5.
SELECT Familia
 , SUM(case when status = 1 then `time` else null) as sum_status1
 , SUM(case when status = 2 then `time` else null) as sum_status2
...
 FROM test GROUP BY t.Familia
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как сформировать запрос / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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