searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

带条件的分组统计count里面怎么写??

2024-05-30 08:45:34
3
0

1.需求

现在需要统计每个id出现指定几种scode的次数;

例:需要统计每个id出现12001,13001,15001出现的次数:

源数据表如下(table_01):

id scode
001 12001
001 15001
002 13001
002 12001
001 12001
001 13001
002 13001
003 18001

需要产出的表如下(table_01):

id cnt_12001 cnt_13001 cnt_15001
001 2 0 1
002 1 2 1

2.实现方式

首先肯定会想到一种"原生态"的方式:

  1. SELECT id

  2. ,COUNT(1) cnt_12001

  3. FROM table_01

  4. WHERE scode = 12001

  5. GROUP BY id;

先将每种scode的数据选出来,一个一个的统计次数,然后再把这几种scode的统计结果按照id join起来,形成一张完整的表.这种方式适用需要统计的scode的种类少的情况,当scode种类有五六七八种的时候这种一个一个去join的方式会让人抓狂的,所以就需要下面这种方式.

  1. SELECT id

  2. ,sum(CASE WHEN scode=12001 THEN 1 ELSE 0 END) cnt_12001

  3. ,sum(CASE WHEN scode=13001 THEN 1 ELSE 0 END) cnt_13001

  4. ,sum(CASE WHEN scode=15001 THEN 1 ELSE 0 END) cnt_15001

  5. FROM table_01

  6. WHERE scode IN (12001,13001,15001 )

  7. GROUP BY id;

这种方式可以将条件下载sum里面,判断好以后再加和,实现了带条件count的功能.

得到table_2:

id cnt_12001 cnt_13001 cnt_15001
001 2 0 1
002 1 2 1

到这里又有人说了,这样的话where条件里面是不是不用写scode的条件了呢?

当where条件中不写scode的条件时,这时id为003的这条信息才会出现

id cnt_12001 cnt_13001 cnt_15001
001 2 0 1
002 1 2 1
003 0 0 0

因为003没有这几种scode的数据,所以id003的统计结果全为0;

当然这里sum换成count也行,那么在count中需要填入什么条件呢?

我们评论见!

0条评论
0 / 1000
吕****伟
2文章数
0粉丝数
吕****伟
2 文章 | 0 粉丝