【问题标题】:Database SQL query group results by first column [duplicate]第一列的数据库SQL查询组结果[重复]
【发布时间】:2018-08-12 15:55:55
【问题描述】:

我需要查询方面的帮助,我想按前两列对结果行进行分组,但我不知道如何继续。

我的查询

 SELECT student_number, homework_name, homework_points 
   FROM student, homework 
   WHERE student.studentid = homework.studentid

以下是我的查询结果

student_number  homework_name  homework_points
--------------  -------------  ---------------
7554            Homework 1     22.5 
7554            Homework 2     16.0
7677            Homework 1     36.0
7677            Homework 2     14.5

我将如何转换查询以获得这样的结果

student_number  Homework 1     Homework 2
--------------  -------------  ---------------
7554            22.5           16.0 
7677            36.0           14.5

任何帮助将不胜感激。

谢谢!

【问题讨论】:

  • 认真考虑处理应用代码中数据显示的问题

标签: mysql sql group-by pivot


【解决方案1】:
SELECT s.student_number, 
       sum(case when h.homework_name = 'Homework 1' then h.homework_points else 0 end) as Homework_1,
       sum(case when h.homework_name = 'Homework 2' then h.homework_points else 0 end) as Homework_2
FROM student s
JOIN homework h ON s.studentid = h.studentid
GROUP BY s.student_number

【讨论】:

    【解决方案2】:

    你可以使用几个连接来完成表作业

       SELECT s.student_number
          , a.homework_points AS  `Homework 1`
          ,  b.homework_points AS  `Homework 21`
       FROM student s
       LEFT JOIN homework a ON s.studentid = a.studentid 
              and a.homework_name =' Homework 1' 
       left JOIN homework b ON s.studentid = b.studentid 
            and b.homework_name =' Homework 2'
        ORDER BY s.student_number
    

    【讨论】:

      【解决方案3】:

      首先,您确实应该使用正确的联接而不是 where 子句来进行联接:

      SELECT student_number, homework_name, homework_points
      FROM student join homework on student.studentid = homework.studentid
      

      你的实际问题,试试这个:

      select student_name,
      h1.homework_points as homework_1,
      h2.homework_points as homework_2
      from student s
      left join homework h1
        on s.studentid = h1.studentid and h1.homework_name = 'Homework 1'
      left join homework h2
        on s.studentid = h2.studentid and h2.homework_name = 'Homework 2'
      where h1.homework_id is not null or h2.homework_id is not null
      

      注意使用左连接是因为某个学生可能只完成了两个作业中的一个。

      【讨论】:

        【解决方案4】:

        用例当

                SELECT student_number, 
                max(case when homework_name='Homework 1' then homework_points end) as Homework1,
               max(case when homework_name='Homework 2' then homework_points end) as Homework2
                FROM student inner join homework 
               on student.studentid = homework.studentid 
              group by student_number
        

        http://sqlfiddle.com/#!9/c33289/2

        id    Homework1  Homework2
        7554    22.5     16
        7677    36       14
        

        【讨论】:

          【解决方案5】:

          我认为其他答案是正确的。

          但是,我觉得您不是在寻找硬编码的列列表。如果这是您想要的,那么您正在寻找“Pivot”SQL 语句。

          在 SQL Server(作为数据透视表)或 PostgreSQL(作为交叉表)中有一些实现,但我没有在 MySQL 或 MariaDB 中看到任何实现。

          【讨论】:

          • 这里有几十个关于 SO 的问题,它们回答了如何在 mysql 中进行旋转。这个问题每天都会被问到。
          猜你喜欢
          • 1970-01-01
          • 2021-07-23
          • 1970-01-01
          • 2020-08-28
          • 1970-01-01
          • 1970-01-01
          • 2023-03-18
          • 2017-01-19
          • 2020-01-20
          相关资源
          最近更新 更多