table 的复杂 SQL 查询要求以不寻常的方式包含数据
A complex SQL query requirement for a table containing data in unusual way
从 table 中提取信息的情况有点复杂。我不确定最好的方法是什么。
我有两个 table:
学生
student_information
学生
id name
-- --------
1 shredder
2 Queen
student_infromation
student_id property value
---------- -------- -----
1 dept CS
1 address DE
1 class X
2 dept MS
2 address DE
2 class IX
运行:
select * from student
join student_information si on student.id = si.student_id
给我这样的输出:
id name student_id property value
-- -------- ---------- -------- -----
1 shredder 1 dept CS
1 shredder 1 address DE
1 shredder 1 class X
2 queen 2 dept MS
2 queen 2 address DE
2 queen 2 class IX
select * from student
join student_information si on student.id = si.student_id
where property in ('dept','class')
我只需要部门的信息和每个学生的 Class 信息,但目前 属性 class 和部门列为行。我想用它做专栏。
我们可以这样构建table吗?
id name dept class
-- -------- ---------- ------
1 shredder cS X
1 queen MS IX
您可以连接两个表,然后按学生汇总,使用旋转逻辑得出您想要的属性:
SELECT
s.id,
s.name,
MAX(CASE WHEN si.property = 'dept' THEN si.value END) AS dept,
MAX(CASE WHEN si.property = 'class' THEN si.value END) AS class
FROM student s
LEFT JOIN student_information si
ON s.id = si.student_id
GROUP BY
s.id,
s.name;
从 table 中提取信息的情况有点复杂。我不确定最好的方法是什么。
我有两个 table: 学生 student_information
学生
id name
-- --------
1 shredder
2 Queen
student_infromation
student_id property value
---------- -------- -----
1 dept CS
1 address DE
1 class X
2 dept MS
2 address DE
2 class IX
运行:
select * from student
join student_information si on student.id = si.student_id
给我这样的输出:
id name student_id property value
-- -------- ---------- -------- -----
1 shredder 1 dept CS
1 shredder 1 address DE
1 shredder 1 class X
2 queen 2 dept MS
2 queen 2 address DE
2 queen 2 class IX
select * from student
join student_information si on student.id = si.student_id
where property in ('dept','class')
我只需要部门的信息和每个学生的 Class 信息,但目前 属性 class 和部门列为行。我想用它做专栏。
我们可以这样构建table吗?
id name dept class
-- -------- ---------- ------
1 shredder cS X
1 queen MS IX
您可以连接两个表,然后按学生汇总,使用旋转逻辑得出您想要的属性:
SELECT
s.id,
s.name,
MAX(CASE WHEN si.property = 'dept' THEN si.value END) AS dept,
MAX(CASE WHEN si.property = 'class' THEN si.value END) AS class
FROM student s
LEFT JOIN student_information si
ON s.id = si.student_id
GROUP BY
s.id,
s.name;