Как сгруппировать таблицу в Sql?

#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