记录一次统计需求中的sql编写
在工作中有一个统计的功能,其实也是比较简单的一个统计功能,就是统计一个已发布文章数量和未发布文章数量,具体我们怎么进行区分呢,那就是这条数据的目前所处的状态,比如:state=4(已发布文章),state=1,2,3,5,那就是未发布文章数量,就是这么一个简单的需求
一、错误想法汇总
1、从sql入手
首先想到的是从sql入手,但是我发现我没有办法在where条件中同时满足两种情况,于是我想到了union,我把两种情况union all一下,这不就是把两种情况组合起来了吗,顺着这个思路,之前也写过这种sql,很快就写出来了,如下所示:
1 SELECT COUNT(1) AS RELEASE_NUM 2 FROM TABLE 3 WHERE FLOW_STATE = '4' 4 UNION 5 SELECT COUNT(1) AS TODO_RELEASE_NUM 6 FROM TABLE 7 WHERE FLOW_STATE IN ('1', '2', '3', '5')
然而,并不是我想要的结果,我想要这两个字段是独立的两列。
2、在程序中处理
这种我想的是我写两个sql然后分别查询出结果,然后再程序中进行判断,组合,但是这样的话,我还要考虑统计项是哪些,因为统计项是变化的,工作量很大,几乎不可能完成,果断放弃了,没办法只能求助他人,哈哈
二、正统思路
还是从sql入手,我们来利用case when 进行判断,来统计状态不同的数据,具体sql如下:
1 SELECT 2 COUNT(CASE WHEN FLOW_STATE = '4' THEN 1 END) AS RELEASE_NUM, 3 COUNT(CASE WHEN FLOW_STATE IN ('1', '2', '3', '5') THEN 1 END) AS TODO_RELEASE_NUM 4 FROM TABLE
注意:这边的group by 还有where条件 还有一些表关联都去掉了,只是看重这种写sql的方法