gpt4 book ai didi

sql - 如何在 SQLite 中转换或以宽格式选择以长格式存储的表?

转载 作者:IT王子 更新时间:2023-10-29 06:17:24 25 4
gpt4 key购买 nike

我想要一个存储学生数据的表 long format以及他们在一次查询中获得的所有科目的分数。

这是我的表结构:

表:markdetails

## studid ## ## subjectid ##  ## marks ##
A1 3 50
A1 4 60
A1 5 70
B1 3 60
B1 4 80
C1 5 95

表:学生信息

实际结构:

## studid ##  ## name ##
A1 Raam
B1 Vivek
c1 Alex

我希望结果集具有以下 wide format枢轴化结果的结构:

表:学生信息

## studid ## ## name## ## subjectid_3 ## ## subjectid_4 ## ## subjectid_5 ##
A1 Raam 50 60 70
B1 Vivek 60 80 null
c1 Alex null null 95

我如何在 SQLite 中完成此操作?

最佳答案

这是为这个例子创建模式的 SQL。对于任何想尝试@Eric 的解决方案的人。

create table markdetails (studid, subjectid, marks);
create table student_info (studid, name);

insert into markdetails values('A1', 3, 50);
insert into markdetails values('A1', 4, 60);
insert into markdetails values('A1', 5, 70);
insert into markdetails values('B1', 3, 60);
insert into markdetails values('B1', 4, 80);
insert into markdetails values('C1', 5, 95);

insert into student_info values('A1', 'Raam');
insert into student_info values('B1', 'Vivek');
insert into student_info values('C1', 'Alex');

这是使用 casegroup by 的替代解决方案。

select
si.studid,
si.name,
sum(case when md.subjectid = 3 then md.marks end) subjectid_3,
sum(case when md.subjectid = 4 then md.marks end) subjectid_4,
sum(case when md.subjectid = 5 then md.marks end) subjectid_5
from student_info si
join markdetails md on
md.studid = si.studid
group by si.studid, si.name
;

为了比较,这里是@Eric 解决方案中的相同选择语句:

select
u.stuid,
u.name,
s3.marks as subjectid_3,
s4.marks as subjectid_4,
s5.marks as subjectid_5
from
student_info u
left outer join markdetails s3 on
u.stuid = s3.stuid
and s3.subjectid = 3
left outer join markdetails s4 on
u.stuid = s4.stuid
and s4.subjectid = 4
left outer join markdetails s5 on
u.stuid = s5.stuid
and s5.subjectid = 5
;

关于sql - 如何在 SQLite 中转换或以宽格式选择以长格式存储的表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1237068/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com