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 '0'
 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对多 订单详细表。所以就要注意了,连接之后就会根据 最多的,最底层的 订单详细表的数量为基准,产生 一张连接表,所以这个时候就会有很多的订单的编号是重复的,所以直接求和就会有很多重复的数据也进行求和了,所以是错的。应该对 消除重复的订单编号 进行求和。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • SQL与MySQL简介 数据库基础 从SQL的角度来看,数据库就是一个以某种有组织的方式存储的数据集合。我们可以采...
    heming阅读 8,715评论 1 8
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,258评论 19 139
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 14,073评论 6 13
  • 不想错过夏天的每个清晨,会尽量每天早起。 昨晚大雨倾盆得不像话,今早起床却已是令人难以置信的晴空万里,阳光普照。 ...
    黄小五littlef5ve阅读 2,118评论 0 0
  • 文/云笙 上一章 前情提示:番邦王子来求娶以为公主,母妃和我一直在紧张着,怕这位王子选上了我。可是谁也没有想到,王...
    云笙阅读 1,229评论 3 4

友情链接更多精彩内容