使用MySQL将具有重复值的行转换为列

问题描述 投票:-3回答:1

源表:

Student_id  Student_name     attr_name      attr_value
100           Sam             Course_id     12345
100           Sam             startdate     2019-01-01 
100           Sam             enddate       2019-12-31
100           Sam             Ques1         Do you like this course?
100           Sam             ans1          Yes
100           Sam             Ques2         Provide a rating for this course?
100           Sam             ans2          10
.
.
.
.
100           Sam             Ques(N)        XXXX
100           Sam             ans(N)         YYYY

编写SQL查询以获得以下结果?

Student_id  Student_name    Course_id   start_date  end_date        Ques                                Ans
100         Sam           12345         2019-01-01  2019-12-31      Do you like this course?            Yes
100         Sam           12345         2019-01-01  2019-12-31      Provide a rating for this course?   10
.
.
.
.
100         Sam           12345         2019-01-01  2019-12-31      XXXX                                YYYY

直到现在我都可以得到它,但是不能绕过最后两列。

SELECT 
    Student_id, 
    Student_name, 
    MAX(CASE WHEN attr_name = 'Course_id' THEN attr_value END) AS Course_id,
    MAX(CASE WHEN attr_name = 'startdate' THEN attr_value END) AS start_date,
    MAX(CASE WHEN attr_name = 'enddate'   THEN attr_value END) AS end_date 
FROM 
    Source 
GROUP 
    BY 1, 2

有人可以帮我吗?预先感谢!

sql pivot
1个回答
0
投票

我不推荐这种桌子设计。关系数据库的优点是可以在表之间建立关系,然后再进行联接,因此您不必将所有内容都填充到一个表中。优点之一是每行都没有重复数据:100,“ Sam”。最好在这里至少有3个表:Student,Attribute,AttributeValue。或者至少,期望结果中的所有列都应该是数据库设计。也许这就是您要实现的目标。

话虽如此,您可以做这样的事情:

select 
student.student_id
,(select distinct student_name from Source s where s.student_id = student.student_id) as student_name
,(select attr_value from Source s where s.student_id = student.student_id and attr_name = 'course_id') as course_id
,(select attr_value from Source s where s.student_id = student.student_id and attr_name = 'start_date') as start_date
-- ETC. for every attribute
from (select distinct student_id, student_name from Source) student 
order by student_id
-- if you wanna order by an attr other than student_id, you have to write as the select above:
--order by (select attr_value from Source s where s.student_id = student.student_id and attr_name = 'course_id')

© www.soinside.com 2019 - 2024. All rights reserved.