sql - 在缺少记录的 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;
解决方案
这是带有 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;
推荐阅读
- python - python AttributeError:'mHID'对象没有属性'dict'
- angular-cli - @angular/cli 的选项路径是什么?
- c# - 既然我们有多播委托,为什么我们需要事件?
- javascript - 试图确定图像元素的可见部分(jQuery)
- utf-8 - 这些表情符号是有效的 UTF-8 吗?
- python - 如何顺序组合2个tensorflow模型?
- javascript - 使用 webpack 加载噩梦时出错
- c - C中调用结构的动态方法
- powershell - 如何从 RStudio 终端进行 SSH 登录
- powershell - 我可以在一个while循环内的一个日志文件中有两个“尾巴”,一个条件做一件事,另一个做别的事情吗?