博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL 语句技巧--聚合函数的灵活使用
阅读量:7041 次
发布时间:2019-06-28

本文共 1476 字,大约阅读时间需要 4 分钟。

  hot3.png

在CSDN看到一篇贴子,是讨论一个SQL语句的写法:要求如下    

表:tblDept(ID,DeptName) 

表:tblSalary(ID,DeptID,Name,Salary) 
create table  tblDept(ID int,DeptName nvarchar(20))
create table  tblSalary(ID int,DeptID int,Name nvarchar(20),Salary decimal(10,2))
请用SQL语句写出: 
  超过半数的部门员工工资大于3000元的部门

  插入测试数据:

复制代码

insert into tblDept

select 1,'DotNet' union all select 2,'Java'
insert into tblSalary
select 1,1,'张三',2000 union all
select 2,1,'李四',2800 union all
select 3,2,'王五',2900 union all
select 4,2,'找刘',3200 union all
select 5,2,'王启',3400 

复制代码

   我的写法是如下: 

select * from  tblDept

where id in(select DeptID from  tblSalary group by DeptID having  
count(case when Salary>3000 then 1 else 0 end)/count(*)>0.5)

   后来发现这里有点不对:

    1,后面相除数据不能为小数。

    2,count函数理解错误。

  修改最后的结果是:  

select * from  tblDept

where id in(select DeptID from  tblSalary group by DeptID having  
sum(case when Salary>3000 then 1 else 0 end)*1.0/count(*)>0.5)

  原因:

    这里有两点概念没有弄清楚:count,整数相除  

1,COUNT : 和表达式的值无关

COUNT(*) 计算数量,包括 NULL 值。

COUNT(ALL expression) 计算数量,不包括 NULL 值 。
COUNT(DISTINCT expression) 计算唯一值数量,不包括 NULL 值

 测试数据:

select count(t)

from (
select null t union  select 1 t  union  select 6 t 
) t

 

   2,整数相除,转换为数据必须*1.0转化

 

 总结

   这样这个语句有两个写法:   

select * from tblDept

where id in(select DeptID from tblSalary group by DeptID having  
count(case when Salary>3000 then 1 else null end)*1.0/count(*)>0.5)

  或: 

select * from tblDept

where id in(select DeptID from tblSalary group by DeptID having  
sum(case when Salary>3000 then 1 else 0 end)*1.0/count(*)>0.5)

转载于:https://my.oschina.net/ldm95/blog/745887

你可能感兴趣的文章
expect基础用法及示例
查看>>
shell编程(一)
查看>>
Perl Learning - 6 (subroutine, function, my)
查看>>
关于Apache的一些配置——如何配置虚拟主机
查看>>
varnish 页面跳转
查看>>
CentOS7.5安装Gitlab11.0及汉化
查看>>
C#程序代码中常用的快捷键
查看>>
进程控制(学习笔记)
查看>>
hibernate中sorted collection和ordered collection区别
查看>>
“***”眼中云计算的“五大漏洞”
查看>>
网页练习
查看>>
JAVA继承和组合
查看>>
编写一个c语言程序 将一串字符串倒叙存放后输出
查看>>
网页设计师和网页前端开发我该选择哪一个
查看>>
我的友情链接
查看>>
推荐自己做的在线流程图、UML、架构图绘制网站
查看>>
用Sublime Text2和MinGW 搭建c编程环境 cc1plus.exe报错
查看>>
八皇后问题--递归与非递归的实现
查看>>
JAVA系列之JVM加载
查看>>
[LeetCode] replace into a Cyclic Sorted List
查看>>