|
|
|
Как сформировать запрос
|
|||
|---|---|---|---|
|
#18+
Добрый день! Не знаю, как написать запрос с группировкой. Есть таблица с оценками учеников: ------------------------- 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 Кто нибудь знает оптимальное решение? Спасибо за ответы! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2015, 14:32:23 |
|
||
|
Как сформировать запрос
|
|||
|---|---|---|---|
|
#18+
вот еще второе решение (но не во всех СУБД такое возможно) ------------------------------------ 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2015, 16:21:49 |
|
||
|
Как сформировать запрос
|
|||
|---|---|---|---|
|
#18+
чем проще тем лучше SELECT t.Familia , SUM(t.ball = 5), SUM(t.ball = 4), SUM(t.ball = 3) FROM test t GROUP BY t.Familia ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2015, 16:39:20 |
|
||
|
Как сформировать запрос
|
|||
|---|---|---|---|
|
#18+
Alex_Ustinov, Вы ответили на мой вопрос, спасибо! Я не думал про такую конструкцию! Работает! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2015, 21:31:08 |
|
||
|
Как сформировать запрос
|
|||
|---|---|---|---|
|
#18+
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 ------------------------------------- Возможно и здесь есть элегантное решение?! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2015, 08:45:49 |
|
||
|
Как сформировать запрос
|
|||
|---|---|---|---|
|
#18+
Получается, что здесь можно написать так: 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 Есть ли вариант попроще? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2015, 09:23:20 |
|
||
|
Как сформировать запрос
|
|||
|---|---|---|---|
|
#18+
Получается, что здесь можно написать так: SELECT Familia, SUM( (status = 1)*time ), SUM( (status = 2)*time ), SUM((status = 3)*time ) FROM test GROUP BY t.Familia ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2015, 09:35:32 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39021485&tid=1832871]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
38ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 253ms |
| total: | 386ms |

| 0 / 0 |
