【SQL】一条查询中统计同一字段不同记录值数量(频数统计)的写法
SQL查询中经常会碰到需要在一条语句中统计某字段中不同记录值的数量,即频数统计。在看《高性能MySQL》(https://book.douban.com/subject/23008813/)这本“葵花宝典”时看到里面总结了两种方法,我在这里再整理记录一下:一种是“SUM”法;另一种是“COUNT”法。
如示例表“visitor_province_day”数据所示,记录游客在每个省驻留的天数。现在想知道若干省份(如“陕西省”和“浙江省”)被游客游览的次数,就可以直接计数它们的记录数来进行统计。
mysql> select * from visitor_province_day; +---------+-----------+-----+ | visitor | province | day | +---------+-----------+-----+ | 1 | 陕西省 | 5 | | 1 | 河北省 | 2 | | 1 | 浙江省 | 9 | | 11 | 浙江省 | 7 | | 11 | 江苏省 | 3 | | 11 | 湖南省 | 1 | | 11 | 福建省 | 4 | | 11 | 陕西省 | 1 | | 11 | 浙江省 | 5 | | 11 | 广东省 | 9 | | 11 | 陕西省 | 11 | +---------+-----------+-----+
“SUM”写法。
SELECT SUM(IF(vpd.province = "陕西省", 1, 0)) AS cnt_sx, SUM(IF(vpd.province = "浙江省", 1, 0)) AS cnt_zj FROM visitor_province_day AS vpd;
+--------+--------+ | cnt_sx | cnt_zj | +--------+--------+ | 3 | 3 | +--------+--------+
“COUNT”写法。
SELECT COUNT(vpd.province = "陕西省" OR NULL) AS cnt_sx, COUNT(vpd.province = "浙江省" OR NULL) AS cnt_zj FROM visitor_province_day AS vpd;
+--------+--------+ | cnt_sx | cnt_zj | +--------+--------+ | 3 | 3 | +--------+--------+
由结果可以看出样本中两个省份的频次是一样的,都是3次。如果要进行多个匹配,把“=”改成“IN”列表的形式就可以了,如IN("陕西省", "浙江省")。更甚,也可以把等号替换成“LIKE”或者“REGEXP”模糊匹配噢!
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: sql中统计一列中重复的数据个数
- 下一篇: 找出数组a[]中符合a[i]+a[j]=K的数对