在mysql中将按行数据转换为按列数据

时间:2019-01-03 12:00:59

标签: mysql

我有一个按科目排列的学生分数的数据。我希望将其转换为每位学生的专栏文章。

我经历了堆栈溢出问题,看到了很少的解决方案并尝试了这些解决方案,但是这些解决方案都没有帮助,或者我没有正确执行这些解决方案。

输入:

 UID     SUBJECT     MARKS
16001   Chemistry   45
16001   CS          52
16001   English     28    
16002   Chemistry   25
16002   CS          25
16002   English     50
16011   Biology     25
16011   Chemistry   30
16011   English     40
16011   Physics     50

Expected Output
 UID       Maths    Physics  Chemistry Biology   CS   English
 16001      -        -       45         -        52     28
 16002      -        -       25         -        25     50
 16011      -        50      30         25       -      40

Query Written
select uid, 
  (case when subject='Maths' then Marks else '-' end) Maths,
  (case when subject='Physics' then Marks else '-' end) Physics,
  (case when subject='Chemistry' then Marks else '-' end) Chemistry,
  (case when subject='Biology' then Marks else '-' end) Biology,
  (case when subject='CS' then Marks else '-' end) CS,
  (case when subject='English' then Marks else '-' end) English
  from subWiseMarks
group by uid;

Output I'm getting
 UID       Maths    Physics  Chemistry Biology   CS   English
 16001      -        -       45         -        -      -
 16002      -        -       25         -        -      -
 16003      -        -       42         -        -      -
 16011      -        -       -          25       -      -

这意味着我仅获得每个学生的第一个条目。这段代码有什么错误。任何帮助表示赞赏。谢谢。

2 个答案:

答案 0 :(得分:0)

您可以在下面尝试-您必须在此处使用最大/最小聚合

select uid, 
  max(case when subject='Maths' then Marks else '-' end) Maths,
  max(case when subject='Physics' then Marks else '-' end) Physics,
  max(case when subject='Chemistry' then Marks else '-' end) Chemistry,
  max(case when subject='Biology' then Marks else '-' end) Biology,
  max(case when subject='CS' then Marks else '-' end) CS,
  max(case when subject='English' then Marks else '-' end) English
  from subWiseMarks
group by uid;

答案 1 :(得分:0)

通过将多个表连接到同一个表来保持简单。 MySql应该可以很好地对此进行优化。

即时编写,未经测试,但这应该可行。

data