首页 > 解决方案 > 在缺少记录的 SQLite 中进行透视

问题描述

我想使用 SQLite 输出基于两个表的记录表:学生和分数。输出中的数据是给定班级的给定学生记录的最高分。我查看了SO #1237068,但是,我的查询必须为学生表中记录但标记表中没有记录的学生输出零。这是我想为学生“Alex”看到的:

studid      name        subjid_3    subjid_4    subjid_5
----------  ----------  ----------  ----------  ----------
A1          Raam        55          60          70
B1          Vivek       60          80          0
C1          Alex        0           0           0

用于创建表和发出查询的(损坏的)SQL 在这里;这不会为 Alex 打印记录。如何修改select语句为亚历克斯写一条记录?

create table marks (studid, subjid, marks);
create table students (studid, name);

insert into marks values('A1', 3, 50);
insert into marks values('A1', 3, 55);
insert into marks values('A1', 4, 60);
insert into marks values('A1', 5, 70);
insert into marks values('B1', 3, 60);
insert into marks values('B1', 4, 80);

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

select si.studid, si.name,
max(case when gd.subjid = 3 then gd.marks else 0 end) subjid_3,
max(case when gd.subjid = 4 then gd.marks else 0 end) subjid_4,
max(case when gd.subjid = 5 then gd.marks else 0 end) subjid_5
from students si
join marks gd
on gd.studid = si.studid
group by si.studid, si.name;

标签: sqlsqlite

解决方案


这是带有 a 的条件聚合left join

select s.studid,
       max(case when m.subjid = 3 then mark else 0 end) as subjid_3,
       max(case when m.subjid = 4 then mark else 0 end) as subjid_4,
       max(case when m.subjid = 5 then mark else 0 end) as subjid_5
from students s left join
     marks m
     on s.studid = m.studid
group by s.studid;

推荐阅读