SQL SUM 空值问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL SUM 空值问题相关的知识,希望对你有一定的参考价值。

ssql="select sum(s_shu) as sshu,sum(s_jin*s_shu) as sjin from s where s_id="&int(rs("g_id"))&" and year(s_time)=2010"

改成
ssql="select isnull(sum(s_shu),0) as sshu,sum(s_jin*s_shu) as sjin from s where s_id="&int(rs("g_id"))&" and year(s_time)=2010"
则返回
错误类型:
Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
[Microsoft][ODBC Microsoft Access Driver] 用于函数参数的个数不对 在查询表达式 'isnull(sum(s_shu),0)' 中。

改成
ssql="select sum(isnull(s_shu,0)) as sshu,sum(s_jin*s_shu) as sjin from s where s_id="&int(rs("g_id"))&" and year(s_time)=2010"
则返回
错误类型:
Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
[Microsoft][ODBC Microsoft Access Driver] 用于函数参数的个数不对 在查询表达式 'sum(isnull(s_shu,0))' 中。 要查询的s_id 没有这条相关的记录

参考技术A 你是ACCESS,,,要用IIF语句。。。 IIF(isnull(abc),true,false);

MySQL--关于MySQL练习过程中遇到的AVG()函数处理空值的问题

最近正准备面试,所以本来不怎么熟悉的SQL语句迫切需要练习,学习一下

在此感谢 笨鸟先飞-天道酬勤 大佬的博客:https://blog.csdn.net/dehu_zhou/article/details/52881587

在题17:按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩

SELECT a.*
	,SUM(CASE WHEN b.Cid=\'01\' THEN b.score ELSE 0 END) AS s01 
	,SUM(CASE WHEN b.Cid=\'02\' THEN b.score ELSE 0 END) AS s02 
	,SUM(CASE WHEN b.Cid=\'03\' THEN b.score ELSE 0 END) AS s03
	,AVG(ifnull(b.score,0)) as  avs
FROM Student a
LEFT JOIN SC b
ON a.Sid=b.Sid
GROUP BY 1,2,3,4
ORDER BY avs DESC ;

最终的结果如下:

 

在这里感觉到了疑惑,为啥07的平均成绩没有计算s01这个值呢,导致最终结果与我想的不符(按3取平均值)

百思不得其解

后来感谢群内大佬的解答 

原因在于:

  AVG()函数统计的是表中的数据,对于SC表而言,需要计算的score值只有2个,所以即便在后续的join语句中,产生了null值,并置为0.在这里也是按SC表中的2个数值计算,而非3个数值;

解决办法:

  方法1:再套一层查询,将结果作为临时表,对临时表字段进行统计

select t.*, round((s01+s02+s03)/3,2) as avs from (
SELECT a.*
	,SUM(CASE WHEN b.Cid=\'01\' THEN b.score ELSE 0 END) AS s01 
	,SUM(CASE WHEN b.Cid=\'02\' THEN b.score ELSE 0 END) AS s02 
	,SUM(CASE WHEN b.Cid=\'03\' THEN b.score ELSE 0 END) AS s03
FROM Student a
LEFT JOIN SC b
ON a.Sid=b.Sid
GROUP BY 1,2,3,4
) t ORDER BY avs desc;

  返回结果:

 

   方法2:根据课程表,补全课程信息

select * from Student t 
LEFT JOIN (
	select a.Sid
		,max(case when a.Cid=\'01\' THEN a.score ELSE 0 END) as s01
		,max(case when a.Cid=\'02\' THEN a.score ELSE 0 END) as s02
		,max(case when a.Cid=\'03\' THEN a.score ELSE 0 END) as s03
		,round(avg(case when a.score is null then 0 else a.score end),2) as avs 
	from SC a group BY a.Sid ) t1
on t.Sid = t1.Sid
;

  返回结果:

 

以上是关于SQL SUM 空值问题的主要内容,如果未能解决你的问题,请参考以下文章

SQL sum结果空值

sql在查询之间不显示空值

SQL语句里怎么将SUM里的空值赋值为0

使用 SQL Select 语句计算空值

在 SQL 查询中过滤掉由窗口函数 lag() 产生的空值

SQL关于:警告: 聚合或其他 SET 操作消除了空值。