• SQL基础:显示不存在的分组数量为0


    某天遇到这样一个问题:

    本公司有报表需要展示区域“alpha”的前一日所有店铺销量,示例如下:
    店铺 昨日销量
    store1 124
    store2 532
    store3 325
    store4 665
     
    某天由于“store3”停业,当日“store3”在store_table表中没有数据。
    当第二天需要出昨日报表数据时。
    报表原本预想展示的数据如下:
    店铺 昨日销量
    store1 168
    store2 480
    store3 0
    store4 720
     
    但是当日报表实际展示为:
    店铺 昨日销量
    store1 168
    store2 480
    store4 720
    那么如何解答?

    在说到题目中的问题之前,我们来回顾一下SQL基础知识。

    在一般的SQL语句中,SQL的执行顺序如下图所示。

     具体来说,就是:FROM—> WHERE—> GROUP BY—>HAVING—> SELECT—>ORDER BY—>LIMIT/OFFSET

    解答题目中的问题,我们还需要了解Join的7种理论基础,鉴于篇幅,直接贴图。

     从上图可以看出,需要连接的表如果需要过滤空值,则需要增加 XXX is null的关联条件,而本题目中恰恰相反,需要需要将为空的显示出来。

    下面看看我的解题思路:

    首先创建2张表,地区表和销售表。

    use mydb;
    create table area_table
    (
        store_id varchar(10) PRIMARY KEY,
    		area varchar(20),		
    		 leader_id int
    );
    
    create table store_table
    (
        store_id varchar(10) ,
        order_id varchar(12)  PRIMARY KEY,
        sales_volume int,
        salesdate date
    ); 

    插入部分业务数据,此处省略。

    题目中需要统计昨天所有alpha地区中的所有店铺的销售情况。(包括店铺3的未营业数量0。)

    由于需要增加空值并显示结果为0,需要在关联的时候增加分空的处理方法,具体SQL如下:

    SELECT
        a.store_id,
        IFNULL( sum( sales_volume ), 0 ) AS sales_volumes 
    FROM
        area_table a
        LEFT JOIN store_table b ON a.store_id = IFNULL( b.store_id, a.store_id ) 
        AND b.salesdate = DATE_SUB( curdate( ), INTERVAL 1 DAY ) 
    WHERE
        a.area = 'alpha' 
    GROUP BY
        a.store_id 
    ORDER BY
        a.store_id;
    注: DATE_SUB(curdate(),INTERVAL 1 DAY) 该函数意为:求出昨天的日期;
    实现过程:
    1.使用curdate()求出当天日期;
    2.使用DATE_SUB(当天日期,INTERVAL 1 DAY)实现当天日期减一天的日期,即昨日日期;
    3.用IFNULL函数处理空数据的情况;
    4.LEFT JOIN的时候关联处理,如果为空ID,显示主表ID
     
    执行出来结果如下:
     
  • 相关阅读:
    一个iOS程序员眼中的跨域问题
    web 大规模并发访问的解决方案
    修改Capfile,在正式环境不再使用migration修改数据库
    关于 CAS 不能登录的问题
    老项目占地比较大的原因是release文件夹里有.git 目录
    capistrano3.4.0部署不能自动登录
    capistrano/blob/v3.4.0部署
    私有方法的查找方式
    开启关闭功能没有生效的原因
    找不到Settings
  • 原文地址:https://www.cnblogs.com/healer007/p/15886248.html
Copyright © 2020-2023  润新知