#mysql #sql #database-design #pivot-table
Вопрос:
У меня есть следующая таблица, Tasks
:
ID | Задача | Тип | Время взято |
---|---|---|---|
1 | задача 1 | тип1 | 01ч:00м |
2 | задача 1 | тип 2 | 02: 00 м |
3 | задача 2 | тип1 | 00ч:30м |
4 | задача 2 | тип 2 | 00ч:30м |
5 | задача 3 | тип1 | 01ч:00м |
6 | задача 3 | тип 2 | 04 часа 00 минут |
Я хочу создать новую таблицу из Tasks
таблицы, которая должна быть
Задача | type1_time | type2_time |
---|---|---|
задача 1 | 01ч:00м | 02: 00 м |
задача 2 | 00ч:30м | 00ч:30м |
задача 3 | 01ч:00м | 04 часа 00 минут |
Можете ли вы помочь мне в построении sql — запроса для этого?
Ответ №1:
У вас есть одна запись для каждой задачи и типа. Если вы хотите сгруппироваться по задаче, вы можете использовать MIN
или MAX
получить доступ к значению типа, так как существует только одно.
select
task,
min(case when type = 'type1' then time_taken end) as type1time,
min(case when type = 'type2' then time_taken end) as type2time
from tasks
group by task
order by task;
Это называется условной агрегацией, потому что мы используем агрегатную функцию для условия (здесь: когда строка соответствует желаемому типу).
Ответ №2:
Я предполагаю, что этот SQL-запрос обрабатывается в базе данных MySQL. Пожалуйста, обратитесь к запросу ниже:
select Task,
sum(if(Type='type1', Time_Taken,0)) as type1_time,
sum(if(Type='type2', Time_Taken,0)) as type2_time from Tasks
group by Task
Комментарии:
1. Спасибо за ответ, но что, если столбец time_taken был типа «char».
2. Я изменил вопрос для вашей справки.
Ответ №3:
-- Solution INNER JOIN
SELECT type1.Task, type1.Time_Taken as 'type1_time', type2.Time_Taken as 'type2_time'
FROM Task type1
INNER JOIN Task type2 on type1.Task = type2.Task
WHERE type1.Type = 'type1'
AND type2.Type = 'type2';
--Solution GROUP_CONCAT
SELECT
t.Task,
GROUP_CONCAT(IF(t.Type = "type1", t.Time_Taken, NULL)) AS 'type1_time',
GROUP_CONCAT(IF(t.Type = "type2", t.Time_Taken, NULL)) AS 'type2_time'
FROM Task t
GROUP BY t.Task;
ДЕМО : https://paiza.io/projects/e/V9GtkWoJQAqewynjRXZ9-Q?theme=twilight
Ответ №4:
Мой запрос даст вам результат, которого вы ожидаете. Демонстрационная ссылка: db-скрипка
SELECT Task,
SEC_TO_TIME(sum(if(Type='type1', TIME_TO_SEC(Time_Taken),0))) as type1_time,
SEC_TO_TIME(sum(if(Type='type2', TIME_TO_SEC(Time_Taken),0))) as type2_time
FROM Tasks
GROUP BY Task