表一 :姓名表
id u_name subject
1 张三 英语
2 李四 德语
3 王五 日语
4 小明 英语
5 小狗 法语
表二 科目表
id s_name
1 英语
2 德语
3 日语
4 法语
表一姓名表 subject 字段来自 表二科目表
现在需要统计的结果为
小计 英语 德语 日语
4 2 1 1
1、创建测试表,
create table test_stu(id number, u_name varchar2(20), subject varchar2(20));
create table test_subj(id number, subject varchar2(20));
2、插入测试数据
insert into test_stu values(1,'张三','英语');
insert into test_stu values(2,'李四','德语');
insert into test_stu values(3,'王五','日语');
insert into test_stu values(4,'小明','英语');
insert into test_stu values(5,'小狗','法语');
insert into test_subj values(1,'英语');
insert into test_subj values(2,'德语');
insert into test_subj values(3,'日语');
insert into test_subj values(4,'法语');
3、查询表中所有记录数,select t.*, rowid from test_subj t,
4、编写sql,统计test_subj总记录数,及每个科目选修学生数;
select count(distinct t.id) as "小计",
count(case when subject='英语' then 1 end) as "英语",
count(case when subject='德语' then 1 end) as "德语",
count(case when subject='日语' then 1 end) as "日语"
from (select t.*
from test_subj t, test_stu b
where t.subject = b.subject) t
sqlserver为例
创建表及插入数据
create table 姓名表然后需要创建一个视图
create view v_subject执行语句
结果截图
你结果里为什么会少呢?
这个主要是动态显示才这么复杂,比如你在科目表里再加个阿拉伯语,用这个也没问题,否则用case when的写法会比较有局限性
追问我想要的结果 就是 不显示某些数据 比如不显示法语
如果没办法我还是用程序实现吧,程序就是效率太低太低了;
还有一个问题如果英语有分支的话又该怎么办?比如英语下面又分为美式英语,英式英语
统计结果
小计 美式英语 英式英语 德语 日语
4 1 1 1 1
必须要写存储过程吗 ,用程序递归实现很简单,sql比较复杂
这样加两个where条件不行吗