首页 > 试题广场 >

统计所有课程参加培训人次

[编程题]统计所有课程参加培训人次
  • 热度指数:38035 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
某公司员工培训信息数据如下:
员工培训信息表cultivate_tb(info_id-信息id,staff_id-员工id,course-培训课程),如下所示:
注:该公司共开设了三门课程,员工可自愿原则性培训0-3项,每项课程每人可培训1次。
info_id staff_id course
101 1 course1,course2
102 2 course2
103 3 course1,course3
104 4 course1,course2,course3
105 5 course3
106 6 NULL
107 7 course1,course2
问题:请统计该公司所有课程参加培训人次?
示例数据结果如下:
staff_nums
11
解释:course1课程共有员工1、3、4、7共4名员工培训;
course2课程共有员工1、2、4、7共4名员工培训;
course3课程共有员工3、4、5共3名员工培训。
示例1

输入

drop table if exists  `staff_tb` ; 
CREATE TABLE `staff_tb` (
`staff_id` int(11) NOT NULL,
`staff_name` varchar(16) NOT NULL,
`staff_gender` char(8) NOT NULL,
`post` varchar(11) NOT NULL,
`department` varchar(16) NOT NULL,
PRIMARY KEY (`staff_id`));
INSERT INTO staff_tb VALUES(1,'Angus','male','Financial','dep1'); 
INSERT INTO staff_tb VALUES(2,'Cathy','female','Director','dep1'); 
INSERT INTO staff_tb VALUES(3,'Aldis','female','Director','dep2'); 
INSERT INTO staff_tb VALUES(4,'Lawson','male','Engineer','dep1'); 
INSERT INTO staff_tb VALUES(5,'Carl','male','Engineer','dep2'); 
INSERT INTO staff_tb VALUES(6,'Ben','male','Engineer','dep1'); 
INSERT INTO staff_tb VALUES(7,'Rose','female','Financial','dep2'); 

drop table if exists  `cultivate_tb` ;   
CREATE TABLE `cultivate_tb` (
`info_id` int(11) NOT NULL,
`staff_id` int(11) NOT NULL,
`course` varchar(32) NULL,
PRIMARY KEY (`info_id`));
INSERT INTO cultivate_tb VALUES(101,1,'course1,course2');
INSERT INTO cultivate_tb VALUES(102,2,'course2');
INSERT INTO cultivate_tb VALUES(103,3,'course1,course3');
INSERT INTO cultivate_tb VALUES(104,4,'course1,course2,course3');
INSERT INTO cultivate_tb VALUES(105,5,'course3');
INSERT INTO cultivate_tb VALUES(106,6,NULL);
INSERT INTO cultivate_tb VALUES(107,7,'course1,course2');

输出

staff_nums
11
select (sum(course like '%1%') + sum(course like '%2%') + sum(course like '%3%')) as staff_nums
from cultivate_tb

发表于 2024-09-14 11:06:19 回复(11)
select SUM(
       ROUND (   
            (
                LENGTH(course)
                - LENGTH( REPLACE ( course, ",", "") ) 
            ) / LENGTH(",")        
        )+1
    ) AS staff_nums   
from cultivate_tb


WITH RECURSIVE numbers AS (
    SELECT 1 AS n
    UNION ALL
    SELECT n + 1 FROM numbers WHERE n < 100
),
t1 AS (
    SELECT
    info_id,
    staff_id,
    SUBSTRING_INDEX(SUBSTRING_INDEX(course, ',', n), ',', -1) AS course
FROM
    cultivate_tb
JOIN
    numbers
ON
    LENGTH(course) - LENGTH(REPLACE(course, ',', '')) >= numbers.n - 1
WHERE course IS NOT NULL
)
SELECT count(*) AS staff_nums FROM t1;
编辑于 2025-04-05 10:14:19 回复(16)
with t1 as(select staff_id
from cultivate_tb
where course like "%course1%"
union all
select staff_id
from cultivate_tb
where course like "%course2%"
union all
select staff_id
from cultivate_tb
where course like "%course3%")
  
select count(*) as staff_nums
from t1
编辑于 2024-04-04 20:28:28 回复(2)
select sum(
    case when course is null then 0 
        when length(course) = 7 then 1 
        when length(course) >= 18 then 3 
        else 2 end 
) as staff_nums 
from cultivate_tb; 
题目有问题,最后输出的列名,必须是staff_nums,才可以通过

发表于 2024-08-16 18:37:30 回复(4)
其实以上的回答99%在工作中不正确,工作通常是要各课程参与的人数
而课程需要穷举,而不能用逗号或123判断。①是课程可能本身很多,列出来麻烦 ②后面可能添加新的课程,这样代码就需要修改不能服用
思路:在hive使用LATERAL VIEW和爆炸函数explode、分隔函数split
WITH t2 AS 
(
    SELECT
        staff_id,
        course_2
    FROM
        t1
    LATERAL VIEW explode(split(course, ',')) course_split AS course_2
)
SELECT
    course_2,
    COUNT(DISTINCT staff_id) AS num
FROM
    t2  
GROUP BY 
    course_2


发表于 2025-01-18 17:30:16 回复(9)
select
    sum(round(length (course) / 7)) staff_nums
from
    cultivate_tb


发表于 2024-06-14 10:50:12 回复(4)
好牛反正我是没做出来,借鉴一下牛人的做法
1,先计算course这列的字符长度length(course)
1.把,先用空格代替
replace(course,',',' ')
2.用空格代替之后计算一下总的长度减去删除逗号之后的长度的差值,这个差值就是逗号的数量
4. 如果不是逗号的话可以再除以一下lengt(',')反正就是字符的长度
5. 然后用((length(course) - length(replace(course,',',' ')) /length(',') ) + 1,因为逗号数量会比实际上的课程数量少1,
6.用sum把每一行的课程数加起来
select sum((length(course) - length(replace(course,',',' ')) /length(',') ) + 1) staff_nums from 
发表于 2024-07-08 16:25:49 回复(4)
select
    sum(
        case
            when course is null then 0
            when course = 'course1,course2,course3' then 3
            when course in ('course1', 'course2', 'course3') then 1
            else 2
        end
    ) staff_nums
from
    cultivate_tb

发表于 2025-03-24 00:41:43 回复(2)
select sum(
    CASE WHEN course = 'course1,course2,course3' THEN 3
    WHEN course in ('course1,course2','course2,course3','course1,course3') THEN 2
    WHEN course in ('course3','course2','course1')  THEN 1
    else 0 end) as staff_nums
from cultivate_tb
发表于 2024-10-13 14:26:52 回复(1)
with `tp` as (select `staff_id` from `cultivate_tb` where `course` like "%course1%"
union all select `staff_id` from `cultivate_tb` where `course` like "%course2%"
union all select `staff_id` from `cultivate_tb` where `course` like "%course3%"
)
select count(`staff_id`) as `course_pv` from `tp`;
发表于 2024-05-20 22:06:37 回复(0)
select
    sum(
        case
            when course like '%,%,%' then 3
            when course like '%,%' then 2
            when course is null then 0
            else 1
        end
    ) staff_nums
from
    cultivate_tb;

发表于 2025-05-01 15:45:23 回复(1)
题目能不能严谨一点啊,描述和最后答案的列名都不一致
发表于 2024-10-15 07:37:42 回复(0)
SELECT
    SUM(a.a) staff_nums
FROM
    (
        SELECT
            COUNT(*) a
        FROM
            cultivate_tb
        WHERE
            course LIKE '%course1%'
        UNION ALL
        SELECT
            COUNT(*) a
        FROM
            cultivate_tb
        WHERE
            course LIKE '%course2%'
        UNION ALL
        SELECT
            COUNT(*) a
        FROM
            cultivate_tb
        WHERE
            course LIKE '%course3%'
    ) a

发表于 2024-08-21 12:56:37 回复(0)
with tmp1 as
(select staff_id,
case when course like '%course1%' then 1 else 0 end as course1,
case when course like '%course2%' then 1 else 0 end as course2,
case when course like '%course3%' then 1 else 0 end as course3
from
cultivate_tb)
select sum(course1)+sum(course2)+sum(course3) as staff_nums
from tmp1
发表于 2024-08-13 10:47:01 回复(1)
本来以为不行,会把null的算成1,结果null的还是null
select
sum(length(course)-length(replace(course,',',''))+1) as staff_nums
from cultivate_tb


发表于 2024-10-24 15:09:20 回复(0)
用总长度 减去 去掉逗号的 长度 就是 逗号数量 -- 计算 course 列中逗号分隔值的数量总和 SELECT SUM( ROUND( ( LENGTH(course) - LENGTH(REPLACE(course, &quot;,&quot;, &quot;&quot;)) ) / LENGTH(&quot;,&quot;) + 1 ) ) AS staff_nums FROM cultivate_tb;
编辑于 2024-05-31 15:55:12 回复(1)
select
sum(case
when course is null then 0
else length(course) - length(replace(course, ',', '')) + 1
end
) as staff_nums
from cultivate_tb
发表于 2025-12-16 23:44:23 回复(0)
select
round(sum((length(course)-length(replace(course,'course','')))/6),0) as staff_nums
from cultivate_tb
发表于 2025-10-22 14:57:21 回复(0)
select sum(
    (case when course is null then 0
        when length(course) = 7 then 1
        when length(course) >= 18 then 3
        else 2
    end)
    ) as staff_nums
from cultivate_tb

发表于 2025-09-30 10:56:57 回复(0)
比较便于思考:
with
    t1 as (
        select
            staff_id,
            case
                when course like '%1%' then 1
                else 0
            end as course_1,
            case
                when course like '%2%' then 1
                else 0
            end as course_2,
            case
                when course like '%3%' then 1
                else 0
            end as course_3
        from
            cultivate_tb
    )
select
    sum(course_1) + sum(course_2) + sum(course_3) as staff_nums
from
    t1


发表于 2025-09-17 11:11:41 回复(0)