【问题标题】:How to group a table in Sql?如何在Sql中对表进行分组?
【发布时间】:2021-11-16 13:20:31
【问题描述】:

我有下表,Tasks

ID Task Type Time_Taken
1 task1 type1 01h:00m
2 task1 type2 02h:00m
3 task2 type1 00h:30m
4 task2 type2 00h:30m
5 task3 type1 01h:00m
6 task3 type2 04h:00m

我想从Tasks 表创建一个新表,应该是

Task type1_time type2_time
task1 01h:00m 02h:00m
task2 00h:30m 00h:30m
task3 01h:00m 04h:00m

您能帮我为此构建一个 sql 查询吗?

【问题讨论】:

    标签: mysql sql database-design pivot-table


    【解决方案1】:

    我假设这个 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
    

    【讨论】:

    • 感谢您的回答,但如果 time_taken 列是 'char' 类型怎么办。
    • 我已经修改了问题供您参考。
    【解决方案2】:
    -- 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

    【讨论】:

      【解决方案3】:

      我的查询会给你你所期望的结果。演示链接:db-fiddle

      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
      

      【讨论】:

        【解决方案4】:

        每个任务和类型都有一个条目。如果要按任务分组,可以使用MINMAX 访问类型的值,因为只有一个。

        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;
        

        这称为条件聚合,因为我们在条件上使用聚合函数(这里:当行匹配所需类型时)。

        【讨论】:

          猜你喜欢
          • 2019-11-08
          • 1970-01-01
          • 2022-11-15
          • 2018-11-18
          • 1970-01-01
          • 1970-01-01
          • 2022-08-15
          • 2013-04-18
          • 1970-01-01
          相关资源
          最近更新 更多