sql语句统计数量 统计一个字段出现的数量

表一:姓名表idu_namesubject1张三英语2李四德语3王五日语4小明英语5小狗法语表二科目表ids_name1英语2德语3日语4法语表一姓名表subject字段... 表一 :姓名表
id u_name subject
1 张三 英语
2 李四 德语
3 王五 日语
4 小明 英语
5 小狗 法语
表二 科目表
id s_name
1 英语
2 德语
3 日语
4 法语
表一姓名表 subject 字段来自 表二科目表
现在需要统计的结果为

小计 英语 德语 日语
4 2 1 1
展开
 我来答
freechan10
2019-11-16 · TA获得超过2.9万个赞
知道小有建树答主
回答量:263
采纳率:68%
帮助的人:12.9万
展开全部

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

badkano
推荐于2017-10-09 · 知道合伙人体育行家
badkano
知道合伙人体育行家
采纳数:144776 获赞数:885371
团长

向TA提问 私信TA
展开全部

sqlserver为例

创建表及插入数据

create table 姓名表
(id int,
u_name varchar(10),
subject varchar(10))

create table 科目表
(id int,
s_name varchar(10))

insert into 姓名表 values (1,'张三','英语')
insert into 姓名表 values (2,'李四','德语')
insert into 姓名表 values (3,'王五','日语')
insert into 姓名表 values (4,'小明','英语')
insert into 姓名表 values (5,'小狗','法语')

insert into 科目表 values (1,'英语')
insert into 科目表 values(2,'德语')
insert into 科目表 values(3,'日语')
insert into 科目表 values(4,'法语')


然后需要创建一个视图

create view v_subject
as
select a.s_name,SUM(case when a.s_name=b.subject then 1 else 0 end) counts
from 科目表 a left join 姓名表 b on a.s_name=b.subject
group by a.s_name

执行语句

declare @sql varchar(4000)
set @sql = 'select sum(counts) as 合计'
select @sql = @sql + ',sum(isnull(case [s_name] when '''+[s_name]+''' then [counts] end,0)) as 
['+[s_name]+']'
from (select distinct [s_name] from v_subject) as a
select @sql = @sql+' from [v_subject]'
exec (@sql)

结果截图

你结果里为什么会少呢?

这个主要是动态显示才这么复杂,比如你在科目表里再加个阿拉伯语,用这个也没问题,否则用case when的写法会比较有局限性

追问
我想要的结果 就是 不显示某些数据 比如不显示法语
如果没办法我还是用程序实现吧,程序就是效率太低太低了;
还有一个问题如果英语有分支的话又该怎么办?比如英语下面又分为美式英语,英式英语
统计结果
小计 美式英语 英式英语 德语 日语
4 1 1 1 1
必须要写存储过程吗 ,用程序递归实现很简单,sql比较复杂
追答
declare @sql varchar(4000)
set @sql = 'select sum(counts) as 合计'
select @sql = @sql + ',sum(isnull(case [s_name] when '''+[s_name]+''' then [counts] end,0)) as 
['+[s_name]+']'
from (select distinct [s_name] from v_subject where [s_name]<>'法语') as a
select @sql = @sql+' from [v_subject] where [s_name]<>''法语'''
exec (@sql)

这样加两个where条件不行吗

本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
2一瞬间2
2015-01-07 · TA获得超过621个赞
知道小有建树答主
回答量:677
采纳率:0%
帮助的人:351万
展开全部
select subject,count(subject) from 姓名表 group by subject order by id
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式