0

我在数据库中有一个包含两个三列的表ID, NAME, SUBJECT, SCORE 主题只有三个可能的值,math, physics,biology并且每个值在分数字段中都有一个相应的分数。因为每个学生可以选修一门以上的课程,所以该NAME列不是唯一的。

我想扩展表格,使每个主题的值都变成一列,所以我不再有主题和分数列,换句话说,我将有NAME, MATH,PHYSICS,BIOLOGY数学物理和生物学的值是分数,NAME然后列变成独特的

我目前通过使用查询来做到这一点

SELECT T1.NAME, T2.SCORE AS BIOLOGY, T3.SCORE AS PHYSICS, T4.SCORE AS MATH
FROM studenttable T1
LEFT JOIN studenttable T2
ON T1.ID = T2.ID AND T2.SUBJECT = 'biology'
LEFT JOIN studenttable T3
ON T1.ID = T3.ID AND T3.SUBJECT = 'physics'
LEFT JOIN studenttable T4
ON T1.ID = T4.ID AND T4.SUBJECT = 'math'

这似乎可行,但我想知道是否有更好的方法来实现这一目标?还是更整洁的方式?请告诉

4

2 回答 2

0

假设id唯一标识一个学生,id, subject在桌子上是唯一的,并且每个id人都有相同的name

Select
    id,
    name,
    min(case when subject='biology' then score end) as biology,
    min(case when subject='physics' then score end) as physics,
    min(case when subject='math' then score end) as math,
From
    studenttable
Group By
    id,
    name

如果您的数据库支持pivot,使用它可能更简单。

于 2013-09-16T22:53:53.730 回答
0

我不知道这是否会被认为是一种更好的方法,但是枢轴可能会更干净一些。

select *
from (
  select name, subject, score
  from studenttable
) pivot (
  max(score),
  for subject in ('biology', 'physics', 'math')
)
于 2013-09-16T22:55:35.200 回答