sql之表连接和group by +组函数的分析
1、首先我们来先看一个简单的例子:
有[Sales.Orders]订单表和[Sales.Customers]顾客表,表的机构如下


业务要求:筛选 来自“按时打算”国家的用户以及所下的订单数
select
o.custid,COUNT(*) as '订单数'
from [Sales.Orders] o inner join [Sales.Customers] c
on o.custid=c.custid
where c.country='按时打算'
group by o.custid;
这样简单的查询,大家都能够看明白,就不再解释,就是使用了一个 内连接,和group by 进行分组,然后对分组后的数据进行 使用组函数Count进行求和
2、才是要讲解的重点:三张表连接的 组函数的使用问题
这里要增加一张表:[Sales.OrderDetails]订单详细表:表结构:

业务要求:查询出每个用户 买了 多少件商品 下过多少订单
select o.custid,
--SUM(qty):下面 用case是因为:组函数对 null 值不进行处理,所以含有求和之后返回null,而不是0
case
when SUM(qty) is null then ''
else SUM(qty)
end
as '商品数量',-- count(*),(比原来的订单数 多)--:相求订单数量,这是错的,因为三张表 关联,这个时候,并不是级联的 一对多的关系,况且,订单表 处在 一对多的 关系的 中间 的位置
count( distinct o.orderid) as '订单数'--将 重复的 订单 删除掉,这样求出的数量就是 对的了
from [Sales.OrderDetails] od right join [Sales.Orders] o
on od.orderid=o.orderid inner join [Sales.Customers] c
on o.custid=c.custid
group by o.custid
说明:关于外连接和内连接的区别就不再说明,我在以前的文章里面已经进行说明了。现在说明为什么原来的 cunnt(*)是不对了,因为客户表 1对多 订单表,订单表 1对多 订单详细表。所以就要注意了,连接之后就会根据 最多的,最底层的 订单详细表的数量为基准,产生 一张连接表,所以这个时候就会有很多的订单的编号是重复的,所以直接求和就会有很多重复的数据也进行求和了,所以是错的。应该对 消除重复的订单编号 进行求和。
sql之表连接和group by +组函数的分析的更多相关文章
- python实现简易数据库之三——join多表连接和group by分组
上一篇里面我们实现了单表查询和top N查询,这一篇我们来讲述如何实现多表连接和group by分组. 一.多表连接 多表连接的时间是数据库一个非常耗时的操作,因为连接的时间复杂度是M*N(M,N是要 ...
- join多表连接和group by分组
join多表连接和group by分组 上一篇里面我们实现了单表查询和top N查询,这一篇我们来讲述如何实现多表连接和group by分组. 一.多表连接 多表连接的时间是数据库一个非常耗时的操作, ...
- SQL多表连接查询
SQL多表连接查询 本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:student 截图如下: 表2:course 截图如下: (此时这样建表只是为了演示连接SQL语句,当然实际 ...
- sql server 表连接
本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:student 截图如下: SQL多表连接查询(详细实例)_新客网 表2:course 截图如下: SQL多表连接查询(详细实例)_新 ...
- sql之表连接 筛选条件放在 连接外和放在连接里的区别
使用一个简单的例子,说明他们之间的区别 使用的表:[Sales.Orders]订单表和[Sales.Customers]客户表,和上一篇博客的表相同 业务要求:查询出 : 所有的用户 在 2012-1 ...
- SQL多表连接查询(详细实例)
转载博客:joeleo博客(http://www.xker.com/page/e2012/0708/117368.html) 本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:stud ...
- SQL多表连接
在KS系统中分配好权限以后,在用户登录的时候就要通过用户查到角色,通过角色查到界面,界面又属于某个菜单,一共要查4个表.并且不能有重复的记录这个时候就用到了SQL的内连接.SQL的多表连接很方便,以前 ...
- SQL的表连接
每天给自己扫盲,让自己变得越博学. 继续学习<程序员的SQL金典>,这回我们来看看表连接相关的内容.表连接的相关知识在实际的项目开发当中,使用非常广. 所谓表连接,就是通过关联多张表,从而 ...
- SQL多表连接查询(详细实例)(转)
http://www.xker.com/page/e2012/0708/117368.html select * from student,course where student.ID=course ...
随机推荐
- [改善Java代码]优先选择线程池
在Java1.5之前,实现多线程编程比较麻烦,需要自己启动线程,并关注同步资源,防止线程死锁等问题,在1.5版本之后引入了并行计算框架,大大简化了多线程开发. 我们知道线程有5个状态:新建状态(New ...
- 将CSV格式的文件导入到数据中
--创建表 create table t1( id number primary key, name ), score number, subject ) ) --创建控制文件 t1.ctl,以文本的 ...
- git 一个文件还原到某个提交的commit
git checkout ${commit} /path/to/file 参考文献中1的参考链接中的git-checkout(1) Manual Page 中的Name: git-checkout - ...
- 【改进】用Log4net建立日志记录
上一篇随笔中只使用了普通的文件读写来进行日志的写入,正如很多朋友说的,频繁的对文件进行读写会造成很多的问题,代码缺少边界控制和操作控制,没有对资源进行管理,是非常典型的bad code. 然后经过前辈 ...
- html5 之 canvas 相关知识(三)API-strokeStyle-shadow相关
strokeStyle定义和用法 strokeStyle 属性设置或返回用于笔触的颜色.渐变或模式. context.strokeStyle=color|gradient|pattern;//指示绘图 ...
- Java Concurrency - ThreadFactory, 使用工厂方法创建线程
当需要创建多个类似的线程实例时,使用工厂模式替代 new 操作符创建线程,能使代码更为简洁,易于维护.JDK 提供了 java.util.concurrent.ThreadFactory 接口,Thr ...
- C#中显/隐式实现接口及其访问方法
原贴地址: http://www.cnblogs.com/dudu837/archive/2009/12/07/1618663.html 在实现接口的时候,VS提供了两个菜单,一个是"实现接 ...
- 【Android】ADB常用指令与logcat日志(转)
ADB命令简介 ADB是一个功能强大的命令行工具.通过它可以直接和模拟器或真机进行交互.它是一个具有客户端和服务器端的程序. 它主要由三个部分组成: 客户端,它运行在你的开发机上,你可以通过执行adb ...
- 客户端javascript笔记
html 中的 onclick访问的是全局作用域
- 本地安装discuz
出处:http://jingyan.baidu.com/article/b87fe19eb57ff252183568d9.html 网站建目前都很简单,建站容易,管理难,网站做大优化更难.本人有建站经 ...