首页 > 试题广场 >

统计每种性别的人数

[编程题]统计每种性别的人数
  • 热度指数:264683 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
题目:现在运营举办了一场比赛,收到了一些参赛申请,表数据记录形式如下所示,现在运营想要统计每个性别的用户分别有多少参赛者,请取出相应结果

示例:user_submit
device_id profile blog_url
2138 180cm,75kg,27,male http:/url/bigboy777
3214 165cm,45kg,26,female http:/url/kittycc
6543 178cm,65kg,25,male http:/url/tiger
4321 171cm,55kg,23,female http:/url/uhksd
2131 168cm,45kg,22,female http:/urlsydney

根据示例,你的查询应返回以下结果:
gender number
male 2
female 3

示例1

输入

drop table if exists user_submit;
CREATE TABLE `user_submit` (
`id` int NOT NULL,
`device_id` int NOT NULL,
`profile` varchar(100) NOT NULL,
`blog_url` varchar(100) NOT NULL
);
INSERT INTO user_submit VALUES(1,2138,'180cm,75kg,27,male','http:/url/bisdgboy777');
INSERT INTO user_submit VALUES(1,3214,'165cm,45kg,26,female','http:/url/dkittycc');
INSERT INTO user_submit VALUES(1,6543,'178cm,65kg,25,male','http:/url/tigaer');
INSERT INTO user_submit VALUES(1,4321,'171cm,55kg,23,female','http:/url/uhsksd');
INSERT INTO user_submit VALUES(1,2131,'168cm,45kg,22,female','http:/url/sysdney');

输出

male|2
female|3
select substring_index(profile,',',-1) as gender,count(device_id)
from user_submit
group by gender

1、LOCATE(substr , str ):返回子串 substr 在字符串 str 中第一次出现的位置,如果字符substr在字符串str中不存在,则返回0;

2、POSITION(substr  IN str ):返回子串 substr 在字符串 str 中第一次出现的位置,如果字符substr在字符串str中不存在,与LOCATE函数作用相同;

3、LEFT(str, length):从左边开始截取str,length是截取的长度;

4、RIGHT(str, length):从右边开始截取str,length是截取的长度;

5、SUBSTRING_INDEX(str  ,substr  ,n):返回字符substr在str中第n次出现位置之前的字符串;

6、SUBSTRING(str  ,n ,m):返回字符串str从第n个字符截取到第m个字符;

7、REPLACE(str, n, m):将字符串str中的n字符替换成m字符;

8、LENGTH(str):计算字符串str的长度。


发表于 2021-08-26 09:13:36 回复(13)
select substring_index(profile,',',-1) as gender,count(device_id)
from user_submit
group by gender
网上搜索后才明白了这道题 substring_index(profile,',',-1)
要用到substring_index()这个函数的用法
substring_index(str,delim,count)

      str:要处理的字符串

      delim:分隔符

      count:计数

例子:str=www.wikibt.com

      substring_index(str,'.',1)

      结果是:www

      substring_index(str,'.',2)

      结果是:www.wikibt

      如果count是正数,那么就是从左往右数,第N个分隔符的左边的所有内容
      如果count是负数,那么就是从右往左数,第N个分隔符的右边的所有内容
      substring_index(str,'.',-2)

      结果为:wikibt.com

     有人会问,如果我要中间的的wikibt怎么办?

     很简单的,两个方向:

      从右数第二个分隔符的右边全部,再从左数的第一个分隔符的左边:

substring_index(substring_index(str,'.',-2),'.',1);


发表于 2021-10-23 20:34:42 回复(21)
SELECT IF(u.profile LIKE '%female','female','male'),COUNT(1)
FROM user_submit u
GROUP BY IF(u.profile LIKE '%female','female','male');

发表于 2021-08-27 09:00:37 回复(17)
1.复习模糊查询 like的用法
2.复习case when then 的用法
3.新学到 substring_index 用法
代码:
-- 方法1
-- select case when profile like '%,male' then 'male'
--             when profile like '%female' then 'female' end gender,
--         count(device_id)
-- from user_submit
-- group by gender;

-- 方法2
select substring_index(profile,',',-1) gender,
       count(device_id)
from user_submit
group by gender;

发表于 2022-03-29 17:32:31 回复(5)
Select
if(profile like "%female","female","male") as gender,
COUNT(device_id) as number
From user_submit
GROUP by gender
发表于 2021-08-26 17:27:29 回复(3)
SELECT 
CASE 
WHEN profile like '%,male' THEN 'male'
WHEN profile like '%,female' THEN 'female'
END
AS gender
, COUNT(*) as number
FROM user_submit
GROUP BY gender;
发表于 2021-09-23 02:07:12 回复(9)
使用SUBSTRING_INDEX函数根据逗号将profile字段切分,性别位于最后一位,位置填
写-1即可取出性别字段,进行分组计算即可得出所需数据。
发表于 2021-08-25 11:55:55 回复(0)
SELECT
    gender,count(gender)
FROM
    ( SELECT *,CASE WHEN PROFILE LIKE '%female%' THEN 'female' ELSE 'male' END AS gender FROM user_submit ) a 
GROUP BY
    a.gender

我是把题目代码粘贴到navicat中生成表做的,一开始做的时候,我也是使用的是热门方法中一样,但是确无法执行,提示错误:找不到gender列,后搜索SQL语句的执行顺序,便加了括号,嵌套了一层,然后再GROUP by。 寻思来这也操作会更稳妥一些
发表于 2021-12-10 16:40:16 回复(2)
这答案明显不对啊,都没去重
发表于 2022-05-07 21:51:54 回复(3)
select substring_index(profile,',',-1) gender,count(*) number
from user_submit
group by  gender;

发表于 2021-08-25 19:59:27 回复(2)
--法一:
SELECT
    gender,
    count(device_id)
FROM
(
select
    device_id,
    substr(PROFILE,15) as gender
from user_submit
) a
group by a.gender


--法二:
SELECT
    SUBSTR(profile,15) as gender,
    count(device_id) as number
from user_submit
group by gender

--法三:
SELECT
    SUBSTRING_INDEX(profile,',',-1) as gender,
    count(device_id) as number
from user_submit
group by gender


发表于 2022-03-01 10:34:45 回复(1)
结合之前所学,使用case来分条件,like匹配 条件。
select 
case when profile like '%,male' then 'male'
     when profile like '%,female' then 'female'
      end gender,count(*)number
from 
user_submit  
group by gender
发表于 2022-01-12 15:33:03 回复(2)
select 'male' as gender,count(device_id) as 'number'
from user_submit
where profile not like '%female'
group by gender
union all
select 'female' as gender,count(device_id) as 'number'
from user_submit
where profile like '%female'
group by gender
发表于 2021-11-27 16:59:40 回复(2)
select SUBSTR(profile,15) as gender,count(device_id) as number
from user_submit
group by gender;
发表于 2021-10-27 15:44:40 回复(0)
SELECT SUBSTR(PROFILE,15,6) AS gender,COUNT(*)
FROM user_submit
GROUP BY gender


发表于 2021-08-29 14:50:43 回复(3)
这道题显然应该再加上distinct
发表于 2021-10-15 13:40:38 回复(7)
居然一次就成功了,感觉自己是天才,哈哈哈哈哈哈哈
select substr(profile,15) gender,count(*) number
from user_submit
group by gender

发表于 2022-05-26 21:41:02 回复(0)
select substring_index(profile,',',-1) as gender,count(device_id)
from user_submit
group by gender

由于平时很少处理字符串数据清洗,这个还真不熟。
不过有思路知道按逗号分列,然后取最后一个。
实际中遇到这样的情况,通常是百度 mysql+分列函数解决。

发表于 2022-07-15 16:11:33 回复(0)
select (case when profile like '%female%' then 'female' else 'male' end) gender,
count(1) number
from user_submit
group by gender

发表于 2021-10-07 10:57:52 回复(0)
select
  case when profile like '%,male' then 'male'
       when profile like '%,female' then 'female'
  end as gender,
  count(*) as number
from user_submit
group by gender;
注意应该是'%,male'不是'%male',标点符号也要写上!

发表于 2022-07-27 16:27:22 回复(4)