我在一个包含两列三列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'
这似乎有效,但我想知道是否有更好的方法来实现这一目标?还是更整洁的方式?请告诉
答案 0 :(得分: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
,则使用它可能更简单。
答案 1 :(得分:0)
我不知道它是否会被认为是更好的方式,但枢轴可能会更清洁。
select *
from (
select name, subject, score
from studenttable
) pivot (
max(score),
for subject in ('biology', 'physics', 'math')
)