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 +组函数的分析的更多相关文章

  1. python实现简易数据库之三——join多表连接和group by分组

    上一篇里面我们实现了单表查询和top N查询,这一篇我们来讲述如何实现多表连接和group by分组. 一.多表连接 多表连接的时间是数据库一个非常耗时的操作,因为连接的时间复杂度是M*N(M,N是要 ...

  2. join多表连接和group by分组

    join多表连接和group by分组 上一篇里面我们实现了单表查询和top N查询,这一篇我们来讲述如何实现多表连接和group by分组. 一.多表连接 多表连接的时间是数据库一个非常耗时的操作, ...

  3. SQL多表连接查询

    SQL多表连接查询 本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:student  截图如下: 表2:course  截图如下: (此时这样建表只是为了演示连接SQL语句,当然实际 ...

  4. sql server 表连接

    本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:student 截图如下: SQL多表连接查询(详细实例)_新客网 表2:course 截图如下: SQL多表连接查询(详细实例)_新 ...

  5. sql之表连接 筛选条件放在 连接外和放在连接里的区别

    使用一个简单的例子,说明他们之间的区别 使用的表:[Sales.Orders]订单表和[Sales.Customers]客户表,和上一篇博客的表相同 业务要求:查询出 : 所有的用户 在 2012-1 ...

  6. SQL多表连接查询(详细实例)

    转载博客:joeleo博客(http://www.xker.com/page/e2012/0708/117368.html) 本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:stud ...

  7. SQL多表连接

    在KS系统中分配好权限以后,在用户登录的时候就要通过用户查到角色,通过角色查到界面,界面又属于某个菜单,一共要查4个表.并且不能有重复的记录这个时候就用到了SQL的内连接.SQL的多表连接很方便,以前 ...

  8. SQL的表连接

    每天给自己扫盲,让自己变得越博学. 继续学习<程序员的SQL金典>,这回我们来看看表连接相关的内容.表连接的相关知识在实际的项目开发当中,使用非常广. 所谓表连接,就是通过关联多张表,从而 ...

  9. SQL多表连接查询(详细实例)(转)

    http://www.xker.com/page/e2012/0708/117368.html select * from student,course where student.ID=course ...

随机推荐

  1. MapReduce中使用SequenceFile的方式上传文件到集群中

    如果有很多的小文件,上传到HDFS集群,每个文件都会对应一个block块,一个block块的大小默认是128M,对于很多的小文件来说占用了非常多的block数量,就会影响到内存的消耗, MapRedu ...

  2. wap测试学习

    注意要点 UI元素 修改源码 物理键操作(回车.确认) 焦点 习惯性操作(前进.后退.屏幕翻转和停止) 刷新 重启服务器 重启浏览器 异常关闭 书签 cookies/session 缓存 接口 URL ...

  3. Ubuntu系统下常用的新建、删除、拷贝文件命令

    我们在Ubuntu系统中安装程序时,经常要在usr目录下新建.拷贝文件,此文件夹在Linux类系统中需要root权限才能访问,因此用常规的鼠标右键菜单操作是无效的,今天分享一下在终端中使用命令新建.拷 ...

  4. 关于Java的this关键字

    java中的this随处可见,用法也多,现在整理有几点: 1. this是指当前对象自己. 当在一个类中要明确指出使用对象自己的的变量或函数时就应该加上this引用.如下面这个例子中: public ...

  5. Xcode Product -> Archive disabled

    You've changed your scheme destination to a simulator instead of "iOS Device". That's why ...

  6. android——获取ImageView上面显示的图片bitmap对象

    获取的函数方法为:Bitmap bitmap=imageView.getDrawingCache(); 但是如果只是这样写我们得到的bitmap对象可能为null值,正确的方式为: imageView ...

  7. Entity Framework 6.1-Database First介绍

    原文:Entity Framework 6.1-Database First介绍 这种方式是比较传统的以数据库为核心的开发模式.比较适合有数据库DBA的团队.或者数据库已存在的情况. 优缺点: 1.优 ...

  8. 选用 get 与 post 的一些建议

    1.http的请求方法:get  post 2. get:会把请求的内容  放到链接地址里面(数据请求的时候  默认的是get请求) 例:www.baidu.com/user/login?userna ...

  9. 我的博客已搬迁到http://www.lsworks.net

    我的博客已搬迁到http://www.lsworks.net

  10. C/C++中浮点数格式学习——以IEEE75432位单精度为例

    这是浮点数的通常表示形式,在IEEE754中,单精度浮点数有如下形式: 位单精度 个比特存储. 位长 至23偏正值(实际的指数大小+127) 至0位编号(从右边开始为0) S为符号位,Exp为指数字, ...