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. Vim编辑器的常用快捷键.

    Linux中的文本操作离不开Vim编辑器的使用. Vim编辑器的使用相对门槛较高.需要挺长一段时间的适应. 总结一些Vim使用过程中常用的命令(这些命令基本上都是在vim的命令模式下使用) 1.跳转到 ...

  2. 感受函数式编程-scala

    /** * Created by jx_luo on 2015/3/18. */object test03 { def main(Args:Array[String]): Unit ={ val st ...

  3. PHP自定义日期英文格式 Feb 11,2015

    背景:[PHP小工具]项目中,经常会要求多版本语言支持,而日期也是必不可少的组成元素. 英文日期书写顺序分英式和美式,举例如. 美国:月日年(January 8th,2014 或 January 8, ...

  4. (转) DockPanel 右键增加关闭,除此之外全部关闭的功能

    在项目中新建一个class文件,代码如下: using System; using System.Collections.Generic; using System.ComponentModel; u ...

  5. css 等高补偿法

    html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta ...

  6. Eclipse JavaEE设置内置浏览器和外部浏览器

    Eclipse JavaEE设置内置浏览器和外部浏览器 我们在使用Java EE版本的Eclipse开发Java Web程序时,Eclipse会有一个默认的内置浏览器查看网页的效果,如下图 但是内置浏 ...

  7. Shared library can't open object

    将cpp的源文件和.so (shared object)链接成可执行程序之后,无法运行,提示如标题,实际就是找不到共享库. 最终找到了解决办法是: export LD_LIBRARY=./:$LD_L ...

  8. Mac OS X安装OpenCV 3.1.0

    在我的上一篇文章“”中已经介绍了Linux下OpenCV的安装配置方法,在这里仅仅记录Mac上相对于Linux的一点点差异. 1. 安装依赖包 Mac上安装软件包使用的工具是brew,用此来替代Ubu ...

  9. JAVA MemCache 史无前例的详细讲解【转】

    非原创转自:http://nhy520.iteye.com/blog/1775893 这篇文章是我看到的介绍的比较详细的,入门级别算是足足够了 Memcach什么是Memcache Memcache集 ...

  10. webpack+react+jquery和jquery插件

    要引入jquery插件 全局引入jquery plugins : [new webpack.ProvidePlugin({ $: 'jquery', jQuery:'jquery' "win ...