SQL 问题之SUM 和 COUNT 组合使用

问题
在开发的时候,遇到一个相对复杂的逻辑,需要先用CASE...WHEN查询数据,再用SUM求和,首先
把我错误的写法,放在下面,供大家参考:(PS: 羞羞羞...) 
SELECT
	a.deptName,
	b.problemNums,
	b.problemNums AS problemRectNums,
	c.dangerNums,
	c.dangerNums AS dangerDealNums,
	c.dangerRectNums 
FROM
	( SELECT DEPT_NAME deptName FROM statistics_city t GROUP BY t.DEPT_NAME ) a
	LEFT JOIN (
	SELECT
		DEPT_NAME,
		IFNULL( count( 1 ), 0 ) problemNums 
	FROM
		statistics_city t,
		inspect_problem pro 
	WHERE
		pro.REMOVED = 0 
		AND t.DEPT_ID = pro.USER_DEPT_ID 
	GROUP BY
		t.DEPT_NAME 
	) b ON a.deptName = b.DEPT_NAME
	LEFT JOIN (
	SELECT
		DEPT_NAME,
		IFNULL( count( 1 ), 0 ) dangerNums,
		SUM(CASE danger.IS_RECTIFICATION
		WHEN 1 THEN
			**COUNT(1)** ELSE 0
		END) AS dangerRectNums
	FROM
		statistics_city t,
		inspect_danger danger 
	WHERE
		danger.REMOVED = 0 
		AND t.DEPT_ID = danger.USER_DEPT_ID 
	GROUP BY
	t.DEPT_NAME 
	) c ON a.deptName = c.DEPT_NAME
错误提示

在这里插入图片描述

解析
Invalid use of group function

错误内容是: 集函数的无效用法,多个函数用法冲突
因为不能对包含聚合或子查询的表达式执行聚合函数,SUM内部不能嵌套COUNT方法,

解决办法

将COUNT(1)更改成1,即可
完成SQL如下:

SELECT
	a.deptName,
	b.problemNums,
	b.problemNums AS problemRectNums,
	c.dangerNums,
	c.dangerNums AS dangerDealNums,
	c.dangerRectNums 
FROM
	( SELECT DEPT_NAME deptName FROM statistics_city t GROUP BY t.DEPT_NAME ) a
	LEFT JOIN (
	SELECT
		DEPT_NAME,
		IFNULL( count( 1 ), 0 ) problemNums 
	FROM
		statistics_city t,
		inspect_problem pro 
	WHERE
		pro.REMOVED = 0 
		AND t.DEPT_ID = pro.USER_DEPT_ID 
	GROUP BY
		t.DEPT_NAME 
	) b ON a.deptName = b.DEPT_NAME
	LEFT JOIN (
	SELECT
		DEPT_NAME,
		IFNULL( count( 1 ), 0 ) dangerNums,
		SUM(CASE danger.IS_RECTIFICATION
		WHEN 1 THEN
			1 ELSE 0
		END) AS dangerRectNums
	FROM
		statistics_city t,
		inspect_danger danger 
	WHERE
		danger.REMOVED = 0 
		AND t.DEPT_ID = danger.USER_DEPT_ID 
	GROUP BY
	t.DEPT_NAME 
	) c ON a.deptName = c.DEPT_NAME
THE END
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值