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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql语句统计数量 统计一个字段出现的数量相关的知识,希望对你有一定的参考价值。

表一 :姓名表
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

参考技术A

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条件不行吗

本回答被提问者和网友采纳
参考技术B select subject,count(subject) from 姓名表 group by subject order by id

SQL一次性查询一个字段不同条件下的统计结果(另一张表的统计数量)

 

做另一张表的统计,比如本部门有多少在职人员。本岗位有多少女生。

有两个表,分别存放了【操作员】和【单据】,要根据单据的不同类型来分类汇总(销售单、销售退货单,笔数和金额),并且显示在同一张表里,不想用做两次查询再合并的方法,研究了一下,终于搞定:

d_employee表

d_bilndx表

 

代码如下:

复制代码
select  b.inputid as 开单员编号, 
        e.fullname as 开单员, 

        isnull( ( select count(*)
          from d_bilndx
          where draft=3 and biltype=12 and d_bilndx.inputid=e.id
        ), 0) as \'销售开单笔数\',

        isnull( ( select sum(d_bilndx.amount)
          from d_bilndx
          where draft=3 and biltype=12 and d_bilndx.inputid=e.id
        ), 0) as \'销售开单金额\',

        isnull( ( select count(*)
          from d_bilndx
          where draft=3 and biltype=13 and d_bilndx.inputid=e.id
        ), 0) as \'销售退单笔数\',

        isnull( ( select sum(d_bilndx.amount)
          from d_bilndx
          where draft=3 and biltype=13 and d_bilndx.inputid=e.id
        ), 0) as \'销售退单金额\',

        count(b.biltype) as 开单总笔数,
        sum(b.Amount) as 开单金额

from d_bilndx as b
left join d_employee as e 
on b.inputid=e.id 
where b.draft=3 and ( b.biltype=12 or b.biltype=13 )
group by b.inputid, e.fullname, e.id
复制代码

 

得到结果:

 

 

补记:以上代码有一个问题,就是如果没有符合条件的单据,查到的结果为空,而我们可能希望,查不到符合条件的记录,相关字段要显示为0(并且按天来统计),改写代码如下:

 

复制代码
select  e1.id as ePersonCode, e1.FullName as eFullName, 
        isnull(Bill_Sale_NUm, 0) as Bill_Sale_Num, 
        isnull(Bill_Sale_Amount, 0) as Bill_Sale_Amount, 
        isnull(Bill_SaleReturn_Num, 0) as Bill_SaleReturn_Num, 
        isnull(Bill_SaleReturn_Amount, 0) as Bill_SaleReturn_Amount
from d_employee as e1
left join (

        select  b.inputid as ePersonCode, 
                e.fullname as eFullName, 
        
                isnull( ( select count(*)
                  from d_bilndx
                  where biltype=12 and d_bilndx.inputid=e.id and d_bilndx.date>=\'2018-06-03\' and d_bilndx.date<=\'2018-06-03\'
                ), 0) as Bill_Sale_Num,
        
                isnull( ( select sum(d_bilndx.amount)
                  from d_bilndx
                  where biltype=12 and d_bilndx.inputid=e.id and d_bilndx.date>=\'2018-06-03\' and d_bilndx.date<=\'2018-06-03\'
                ), 0) as Bill_Sale_Amount,
        
                isnull( ( select count(*)
                  from d_bilndx
                  where biltype=13 and d_bilndx.inputid=e.id and d_bilndx.date>=\'2018-06-03\' and d_bilndx.date<=\'2018-06-03\'
                ), 0) as Bill_SaleReturn_Num,
        
                isnull( ( select sum(d_bilndx.amount)
                  from d_bilndx
                  where biltype=13 and d_bilndx.inputid=e.id and d_bilndx.date>=\'2018-06-03\' and d_bilndx.date<=\'2018-06-03\'
                ), 0) as Bill_SaleReturn_Amount,
        
                count(b.biltype) as Bill_Total_Num

        from d_employee as e 
        left join d_bilndx as b
        on b.inputid=e.id 
        where (b.draft=3 or b.draft=2) and ( b.biltype=12 or b.biltype=13 ) and  b.date>=\'2018-06-03\' and b.date<=\'2018-06-03\'
        group by b.inputid, e.fullname, e.id


) as t1
on e1.id = t1.ePersonCode
where e1.id<>\'00000\'
order by ePersonCode asc
复制代码

 

得到结果如下:

 

转自:https://www.cnblogs.com/skysowe/p/9117099.html

 

以上是关于sql语句统计数量 统计一个字段出现的数量的主要内容,如果未能解决你的问题,请参考以下文章

SQL语句如何统计数据库当日信息数量

统计数据方面SQL与HQL

SQL统计本日的更新数量

mysql数据库,sql语句,把一个表中的统计数量,更新到两一个表中

SQL 统计个数;条件:指定行间,指定字段值等于A的记录数。

SQL语句怎么按照月统计数量