zoukankan      html  css  js  c++  java
  • sql之表连接和group by +组函数的分析

    1、首先我们来先看一个简单的例子:

    有[Sales.Orders]订单表和[Sales.Customers]顾客表,表的机构如下

    业务要求:筛选  来自“按时打算”国家的用户以及所下的订单数

    1 select
    2 o.custid,COUNT(*) as '订单数'
    3 from [Sales.Orders] o inner join [Sales.Customers] c
    4 on o.custid=c.custid
    5 where c.country='按时打算'
    6 group by o.custid;

    这样简单的查询,大家都能够看明白,就不再解释,就是使用了一个 内连接,和group by 进行分组,然后对分组后的数据进行 使用组函数Count进行求和

    2、才是要讲解的重点:三张表连接的 组函数的使用问题

    这里要增加一张表:[Sales.OrderDetails]订单详细表:表结构:

    业务要求:查询出每个用户 买了 多少件商品  下过多少订单

     1 select o.custid,
     2 --SUM(qty):下面 用case是因为:组函数对  null 值不进行处理,所以含有求和之后返回null,而不是0
     3 case
     4  when SUM(qty) is null then '0'
     5  else  SUM(qty)
     6  end
     7  as '商品数量',-- count(*),(比原来的订单数 多)--:相求订单数量,这是错的,因为三张表 关联,这个时候,并不是级联的 一对多的关系,况且,订单表 处在 一对多的 关系的 中间 的位置
     8   count( distinct o.orderid) as '订单数'--将 重复的  订单 删除掉,这样求出的数量就是  对的了
     9 from [Sales.OrderDetails] od right join [Sales.Orders] o
    10 on od.orderid=o.orderid inner join [Sales.Customers] c
    11 on o.custid=c.custid
    12 group by o.custid

    说明:关于外连接和内连接的区别就不再说明,我在以前的文章里面已经进行说明了。现在说明为什么原来的 cunnt(*)是不对了,因为客户表 1对多 订单表,订单表 1对多 订单详细表。所以就要注意了,连接之后就会根据 最多的,最底层的  订单详细表的数量为基准,产生 一张连接表,所以这个时候就会有很多的订单的编号是重复的,所以直接求和就会有很多重复的数据也进行求和了,所以是错的。应该对 消除重复的订单编号 进行求和。

  • 相关阅读:
    03-spring bean
    04-spring的依赖注入
    01-课程安排
    17-注解开发
    WIN10新机必要设置记录 for 3dsmax
    ps导出svg
    VS C# 共享项目
    在Maxscript中创建.Net类型
    C# 自定义索引
    C# ?
  • 原文地址:https://www.cnblogs.com/xiaoxiaogogo/p/3433562.html
Copyright © 2011-2022 走看看