事情是因为这样了——我需要按2个维度来分组,求出按这2个维度分组的总数情况(count),但同时也需要在这2个维度下求出按不同条件得出的总数,这些不同条件下分别得出的总数相加的和即为不加上条件的情况下的总数。比如:
假设有一张tablename表格,数据结构如下:
字段: id A B condition2
SELECT COUNT(1) cnt, A, B FROM tablename WHERE 1 = 1 AND B LIKE '201602%' GROUP BY A, B ORDER BY A, B
这是从tablename表中取出一定条件下按A,B分组的总数情况,假设现在我B的条件不变,需要统计根据condition字段(假设condition是一个枚举值的字段,即它的取值为1,2,3三种可能)来变化的总数,那么我需要分别写几个sql:
SELECT COUNT(1) cnt, A, B FROM tablename WHERE 1 = 1 AND B LIKE '201602%' AND condition = '1' GROUP BY A, B ORDER BY A, B
这里的count统计条件是AND condition = '1' 还有可能是AND condition = '2'和AND condition = '3',然后这些不同的condition取值条件下的count统计取值分别为cnt1 cnt2 cnt3 则cnt1 + cnt2 + cnt3 = cnt(不加上condition过滤条件时的统计值).
问题来了,如何在一条记录里同时把cnt和cnt1-cnt3都展示出来呢?
之前我是先求出cnt的集合,再循环每一条记录,根据每条记录的A,B和condition取值去得到该条记录加上condition后对应的cnt,但后来发现这是十分不可取的,因为每条记录都得连接数据库去执行sql查询,显得效率低下。。
后来发现在这种情形下,case when then else end就可以起作用,但十分神奇的是,他竟然也能够和count函数结合起来:
ELECT COUNT(1) cnt, COUNT( CASE WHEN condition = '1' THEN 1 ELSE NULL END ) cnt1, COUNT( CASE WHEN condition = '2' THEN 1 ELSE NULL END ) cnt2, COUNT( CASE WHEN condition = '3' THEN 1 ELSE NULL END ) cnt3, A, B FROM tablename WHERE 1 = 1 AND B LIKE '201602%' GROUP BY A, B ORDER BY A, B
这里需要注意count函数里面包围case when then else end的用法;还有一点需注意的是:count(null)得到的是0,这表明不符合当前条件下,走的是else null 这时候count(null)就为0啦~~,即不在当前条件下统计,否则count(1)就是统计了!!!
很神奇吧!看看结果:
多仔细几条记录,会发现每条记录都同时包含了cnt 和cnt1-cnt3,并且cnt = cnt1 + cnt2 + cnt3. 这说明我们这句sql求出的记录是正确的!
补充,同理的还有sum函数包围case when then else end,需注意不满足当前条件走else分支时,是要这样写的,sum(case when condition='1' then val else 0 end),即sum(0)才是0.
小结下:sum(0) = 0 , count(null) = 0. 在遇到这种情形的统计时,可考虑case when then else end语句哦。比如需要在一条记录里「同时」统计出总人数,男生人数和女生人数~~~
相关推荐
### SQL数据库转Access SQL语句改写:Case When Then When Then Else End #### 知识点一:SQL CASE WHEN THEN 结构与Access IIF及SWITCH函数对比 在进行SQL到Access SQL的转换过程中,一个重要的知识点是了解如何...
SUM(CASE WHEN condition THEN value ELSE 0 END) AS total FROM table; ``` 其中: - `condition` 是一个布尔表达式,如果为真,则执行 `THEN` 子句。 - `value` 是当 `WHEN` 条件为真时返回的值,通常是一个...
SUM(CASE WHEN download_type_id = 13 THEN 1 ELSE 0 END) AS count_13, SUM(CASE WHEN download_type_id = 14 THEN 1 ELSE 0 END) AS count_14, SUM(CASE WHEN download_type_id = 15 THEN 1 ELSE 0 END) AS ...
SUM(CASE WHEN u.sex <> 1 AND u.sex <> 2 THEN 1 ELSE 0 END) AS 未知性别总数 FROM users u; ``` 这里,我们使用了 SUM 函数来累加 CASE 语句返回的值。当 `sex` 的值为 1 或 2 时,CASE 语句返回 1,否则返回 0...
SUM(CASE WHEN gender = 0 THEN 1 ELSE 0 END) AS male_count, SUM(CASE WHEN gender = 1 THEN 1 ELSE 0 END) AS female_count FROM students; ``` 这段代码将计算 `students` 表中性别为0(男生)和1(女生)的...
在SQL中,`CASE WHEN THEN` 语句用于条件判断,它可以用来转换或过滤数据,尤其是在聚合函数中,如 `COUNT()`, `SUM()`, `AVG()` 等。这个表达式允许我们在一个查询中根据不同的条件执行不同的操作。 在标题提到的...
SQL 中 Case 语句有两种格式:简单 Case 函数和 Case 搜索函数。这两种格式可以实现相同的功能,但是它们的写法和功能方面有一些限制。 简单 Case 函数的写法相对比较简洁,例如: ``` CASE sex WHEN '1' THEN '男...
在SQL语句中,`SUM` 和 `COUNT` 函数是非常常见的聚合函数,它们用于对一组数据进行求和或计数。然而,在某些场景下,我们可能需要在这些函数中加入条件判断,以便更精确地统计特定条件下的数据。本文将深入讲解如何...
select rq, sum(case when shengfu='胜' then 1 else 0 end) '胜', sum(case when shengfu='负' then 1 else 0 end) '负' from #tmp group by rq ``` 2. 使用子查询和 inner join 实现: ``` select N.rq, N....
方法一、 代码如下:SELECT SUM(正确数)+SUM(错误数) AS 总记录数,SUM(正确数)... 代码如下:select count(1)总记录数,sum(case when status=1 then 1 else 0 end)正确数,sum(case when status=0 then 1 else 0 end) 错
MySQL是世界上最流行的关系型数据库管理系统之一,它提供了丰富的功能,包括流程控制、统计函数和分组查询,这些都是数据库查询和管理的重要组成部分。本篇文章将详细解析这三个方面的用法。 ## 1. 流程控制函数 ...
SUM(CASE WHEN shengfu = '胜' THEN 1 ELSE 0 END) AS '胜', SUM(CASE WHEN shengfu = '负' THEN 1 ELSE 0 END) AS '负' FROM #tmp GROUP BY rq; ``` 在这个查询中,CASE语句用于将每个胜利或失败转换为1或0,...
此外,CASE WHEN还可以用于计算聚合数据,如COUNT()或SUM()。例如,当我们需要统计某个条件下的记录数时,可以使用COUNT(CASE WHEN ... THEN 1 END)。这种方式在处理统计学问题时非常有用,比如统计具有特定特征的...
sum(case when level='一级' then 1 else 0 end) as 一级, sum(case when level='二级' then 1 else 0 end) as 二级, sum(case when level='三级' then 1 else 0 end) as 三级 from table group by type
select rq, sum(case when shengfu='胜' then 1 else 0 end) '胜', sum(case when shengfu='负' then 1 else 0 end) '负' from #tmp group by rq ``` 2)使用inner join和count()语句: ``` select N.rq, N.勝, M.負...
SUM(CASE WHEN shengfu = '胜' THEN 1 ELSE 0 END) AS '胜', SUM(CASE WHEN shengfu = '负' THEN 1 ELSE 0 END) AS '负' FROM #tmp GROUP BY rq; ``` - **解析:**此方法直接在`SELECT`子句中使用`CASE`语句,...
SUM(CASE WHEN IPTV_NBR IS NULL OR IPTV_NBR = '' THEN 0 ELSE 1 END), SUM(CASE WHEN ACC_NBR IS NULL OR ACC_NBR = '' THEN 0 ELSE 1 END), COUNT(*) FROM GAT_SQMS.GAT_SQMS_BAND_IPTV_VIEW GROUP BY AREA_...
SUM(CASE WHEN shengfu = '胜' THEN 1 ELSE 0 END) AS '胜', SUM(CASE WHEN shengfu = '负' THEN 1 ELSE 0 END) AS '负' FROM #tmp GROUP BY rq; ``` 或者,你可以使用子查询和JOIN来达到相同效果: ```sql...
SUM(CASE WHEN shengfu = '胜' THEN 1 ELSE 0 END) AS '胜', SUM(CASE WHEN shengfu = '负' THEN 1 ELSE 0 END) AS '负' FROM #tmp GROUP BY rq; ``` - 方案2:使用两次`GROUP BY`分别计算“胜”和“负”,...