Я основываю запрос на таблице, которая имеет, скажем, результаты событий.В каждом ряду есть команда, которая участвовала, и их итоговое место для этого события (макс. 4 команды участвуют).Я хочу выполнить запрос, основанный на этом, который сгруппирует по событию и создаст столбец для каждого места размещения и заполнит его командой, получившей этот ранг во время этого события.
Для этого я создал поля (first_place, second_place и т. д.), который проверяет условный оператор case по отношению к столбцу ранга, и если команда получит результат, соответствующий этому столбцу, она заполнит столбец именем этой команды.
Проблема, с которой я сталкиваюсь, заключается вчто если я не добавлю случаи в группу, в которой будут возникать ошибки (по крайней мере, в Oracle SQL Fiddle обрабатывает это, но результат все равно неверный).Если я добавлю их к предложению группы, он выведет по 1 строке для каждой команды и ранжирует с остальными столбцами NULL.
Это имеет смысл для такой группировки, но, похоже, не может найтиобходной путь.Я пытался использовать что-то вроде COALESCE, но ничего, что я не мог найти, работает как агрегатная функция.
SQL Fiddle и DDL ниже для вашей справки.Любая помощь приветствуется.
http://sqlfiddle.com/#!9/8ae4c9/1
Определение таблицы
CREATE TABLE Table1
(`pk_id` int, `evt_id` int, `team` varchar(5), `rank` int)
;
INSERT INTO Table1
(`pk_id`, `evt_id`, `team`, `rank`)
VALUES
(1, 1, 'TeamA', 1),
(2, 1, 'TeamB', 2),
(3, 1, 'TeamC', 3),
(4, 1, 'TeamD', 4),
(5, 2, 'TeamD', 1),
(6, 2, 'TeamB', 2),
(7, 2, 'TeamC', 3),
(8, 2, 'TeamA', 4),
(9, 3, 'TeamB', 1),
(10, 3, 'TeamD', 2),
(11, 3, 'TeamC', 3),
(12, 3, 'TeamA', 4),
(13, 4, 'TeamD', 1),
(14, 4, 'TeamC', 2),
(15, 4, 'TeamA', 3),
(16, 4, 'TeamB', 4)
;
Запрос
SELECT
evt_id,
CASE rank WHEN 1 THEN team END as first_place,
CASE rank WHEN 2 THEN team END as second_place,
CASE rank WHEN 3 THEN team END as third_place,
CASE rank WHEN 4 THEN team END as fourth_place
FROM
Table1
GROUP BY
evt_id
;
Текущие результаты
+--------+-------------+--------------+-------------+--------------+
| evt_id | first_place | second_place | third_place | fourth_place |
+--------+-------------+--------------+-------------+--------------+
| 1 | TeamA | (null) | (null) | (null) |
| 1 | (null) | TeamB | (null) | (null) |
| 1 | (null) | (null) | TeamC | (null) |
| 1 | (null) | (null) | (null) | TeamD |
| 2 | TeamD | (null) | (null) | (null) |
| 2 | (null) | TeamB | (null) | (null) |
| 2 | (null) | (null) | TeamC | (null) |
| 2 | (null) | (null) | (null) | TeamA |
| 3 | TeamB | (null) | (null) | (null) |
| 3 | (null) | TeamD | (null) | (null) |
| 3 | (null) | (null) | TeamC | (null) |
| 3 | (null) | (null) | (null) | TeamA |
| 4 | TeamD | (null) | (null) | (null) |
| 4 | (null) | TeamC | (null) | (null) |
| 4 | (null) | (null) | TeamA | (null) |
| 4 | (null) | (null) | (null) | TeamB |
+--------+-------------+--------------+-------------+--------------+
Ожидаемый результат
+--------+-------------+--------------+-------------+--------------+
| evt_id | first_place | second_place | third_place | fourth_place |
+--------+-------------+--------------+-------------+--------------+
| 1 | TeamA | TeamB | TeamC | TeamD |
| 2 | TeamD | TeamB | TeamC | TeamA |
| 3 | TeamB | TeamD | TeamC | TeamA |
| 4 | TeamD | TeamC | TeamA | TeamB |
+--------+-------------+--------------+-------------+--------------+