zoukankan      html  css  js  c++  java
  • mysql使用sum()出现null的问题,各种总结

    今天进行sql查询时,碰到了一个问题:
    SQL语句:
    select r.user_id, r.job_id, sum(t.money) as job_salary
    from pj_punch_records as r left join pj_punch_transactions as t on r.job_id= t.transaction_detail
    where r.user_id = 1 and t.type = 1
    order by r.created_at desc

    1.进行2表关联查询,同时,使用 sum() 来统计金钱总数,主表,并没有对应查询条件的记录,居然出现了一条全部为 NULL 的记录。这个不合理啊!我想要的自然是,没有查询到合适的数据,结果集应该为空!
    2.上面这种情况,当有记录时,就正常了!
    

    解决方法:
    也是胡乱测试了下,发现添加上 'group by r.job_id' 后,发现结果集就为空了!
    没研究过mysql,也没时间好好看看mysql方面的知识。但通过以上的2种情况,猜测:
    select - 作为mysql的输出方法,类似php中的echo等
    碰到 sum() avg() 等mysql的内置函数,或其他非当前、查询的数据表的直接字段(要么是其他语句、要么是把数据表的字段做了什么处理!),都会输出一行数据!
    所以,才有了我们看到的一行全部为NULL的数据!
    而使用 group by r.job_id 对结果进行了聚合,把NULL的记录给过滤了,从而返回了 '空结果集'

    在网上搜索时,也正好找到一篇处理这个问题的,采用的方式为:group by NULL
    http://www.xuebuyuan.com/2008066.html

    网上涉及更多的sum()返回null,是想返回0,这里正好也笔记下:
    1.第一种: 采用 IFNULL(expr1,expr2)函数,当expr1为NULL时,则数据返回默认值expre2
    SELECT IFNULL(SUM(expr),0) -- 表示若 SUM()函数结果返回为NULL泽返回0
    2.第二种: 采用从 COALESCE(value,...) 函数, COALESCE 函数作用是返回传入参数中第一个非空的值
    SELECT COALESCE(SUM(expr),0)
    3.第三种: 采用 case WHEN THEN WHEN THEN .. ELSE END 函数,注意 CASE WHEN 函数最后是以 END 结尾
    SELECT CASE WHEN ISNULL(SUM(expr)) THEN 0 ELSE SUM(expr) END

    参考文章:
    	http://blog.csdn.net/h70614959/article/details/40115395
    	http://blog.csdn.net/qq844579582/article/details/52610484
    
    可查看 SQL NULL 函数:
    	ISNULL()、NVL()、IFNULL()、COALESCE(),这几个函数可能效果差不多
    参考:
    	http://www.w3school.com.cn/sql/sql_isnull.asp
    

    SQL中AVG、COUNT、SUM、MAX等函数对NULL值处理
    一、AVG()
    求平均值
    注意AVE()忽略NULL值,而不是将其作为“0”参与计算
    二、COUNT(),两种用法
    1、COUNT(*)
    对表中行数进行计数
    不管是否有NULL

    		2、COUNT(字段名)
    		对特定列有数据的行进行计数
    		忽略NULL值
    

    三、MAX()、MIN()
    求最大、最小值
    都忽略NULL
    四、SUM()
    可以对单个列求和,也可以对多个列运算后求和
    忽略NULL值,且当对多个列运算求和时,如果运算的列中任意一列的值为NULL,则忽略这行的记录。
    例如: SUM(A+B+C),A、B、C 为三列,如果某行记录中A列值为NULL,则不统计这行。
    五、GROUP BY的使用注意事项
    1、分组列中若有NULL,这也将作为一组,且NULL值排在最前面
    2、除汇总函数计算语句外,SELECT中的选择列必须出现在GROUP BY 中
    3、GROUP BY 可以包含任意数目的列,可以嵌套
    转载文章:
    http://m.studyofnet.com/news/1219.html

  • 相关阅读:
    mysql 的事件之 Waiting for table metadata lock
    postgresl 10 的逻辑复制 logical replication 之一
    postgresql 物理备份 pg_rman
    pg_waldump pg_xlogdump 的初步使用
    centos 7 添加 aliyun yum 源、epel源
    pg_dump 迁移 prod 环境的 function 到 uat 环境
    POSTGRESQL 11 BETA 1 RELEASED!
    使用 mtools 搭架 mongodb 的自动化日志分析平台
    将xml转换为PHP数组
    php自动获取字符串编码函数mb_detect_encoding
  • 原文地址:https://www.cnblogs.com/ljt1412451704/p/12074612.html
Copyright © 2011-2022 走看看