【问题标题】:SQL remove duplicated rows with different values but keep and show them in single rowSQL删除具有不同值的重复行,但将它们保留并显示在单行中
【发布时间】:2018-06-12 13:23:42
【问题描述】:

有 8000 行,包括学生姓名、课程和成绩。总共有 4 门课程,因此这意味着每个学生最多有 4 行。所以我想创建一个包含不同学生姓名的表格,并在同一行显示不同的成绩,如下所示:

非常感谢。

PS。我从您最初的回复中注意到,这不是一件容易的事。那么我可以让表格只显示超过一个年级的学生,因为我对只有一个年级的学生不感兴趣吗?像这样:

【问题讨论】:

  • 我认为生成这样一个精确的表格可能很困难。你真的需要这个精确的输出吗?
  • 如果您想要类似于该输出的内容,您可以研究一个数据透视表,其中包含数学、英语和 IT 的列标题以及下方的相应值。 stackoverflow.com/questions/15931607/…

标签: sql postgresql pivot


【解决方案1】:

你可以做条件聚合:

select name,
       max(case when seq = 1 then Course end) as Course1,
       max(case when seq = 1 then Grade end) as Course1Grade, 
       max(case when seq = 2 then Course end) as Course2,
       max(case when seq = 2 then Grade end) as Course2Grade,
       . . . 
from (select *, row_number() over (partition by name order by course) as seq
      from table
     ) t
group by name;

【讨论】:

    【解决方案2】:

    这肯定会起作用,只需要在另一门课程中添加另一个加入

    SELECT n.name, N.course, N.grade, E.course, E.grade, I.course, I.grade
    FROM (
        SELECT DISTICT name
        FROM STUDENT
        ) N
    LEFT JOIN (
        SELECT name, course, grade
        WHERE course = MATH
        ) M
        ON (N.name = M.name)
    LEFT JOIN (
        SELECT name, course, grade
        WHERE course = ENGLISH
        ) E
        ON (N.name = E.name)
    LEFT JOIN (
        SELECT name, course, grade
        WHERE course = IT
        ) I
        ON (N.name = I.name)
    

    希望这会有所帮助..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-23
      • 2019-10-27
      • 2017-06-09
      • 1970-01-01
      • 2015-10-05
      • 1970-01-01
      • 2016-10-13
      相关资源
      最近更新 更多