考试统计获取数据调整

main
liuyiliang 4 months ago
parent af6612b3f2
commit e05a324fd3
  1. 1
      ccic-exam/src/main/java/com/ccic/safeliab/web/ExamScheduleController.java
  2. 2
      ccic-exam/src/main/resources/mappers/ExamScheduleMapper.xml
  3. 197
      ccic-exam/src/main/resources/mappers/ExamStatisticsMapper.xml

@ -64,6 +64,7 @@ public class ExamScheduleController {
ExamScheduleVO examScheduleVO = new ExamScheduleVO();
examScheduleVO.setCaptcha(examSchedule.getCaptcha());
examScheduleVO.setPath(examSchedule.getPath());
examSchedule.setId(examSchedule.getId());
return R.ok().data(service.saveOrUpdate(examScheduleVO));
}

@ -62,7 +62,7 @@
industry_id as regulatory_industry
from ex_exam_papers
where is_deleted = 0
and status = 1
and paper_status = 1
</select>
<select id="getExamParticipation" resultType="java.util.Map">
SELECT

@ -37,64 +37,63 @@
]]>
</select>
<select id="getAqServiceDimensionData" resultType="java.util.Map">
SELECT
COUNT ( q.ID ) AS "value",
( dict.dict_value || ': ' || COUNT ( q.ID ) || ' 条' ) AS "name"
FROM
ex_dict dict
LEFT JOIN ex_question_categories q ON q.service_type_id = dict.dict_key
AND q.is_deleted = 0
AND q.status = 1
<if test="id != null and id != ''">
AND q.industry_id = #{id}
</if>
WHERE
dict.code = 'serviceTypeDict'
AND dict.is_deleted = 0
<![CDATA[ AND dict.parent_id <> 0 ]]>
SELECT
COUNT ( q.ID ) AS "value",
( dict.dict_value || ': ' || COUNT ( q.ID ) || ' 条' ) AS "name"
FROM
ex_dict dict
LEFT JOIN ex_question_categories q ON q.service_type_id = dict.dict_key
AND q.is_deleted = 0
AND q.status = 1
<if test="id != null and id != ''">
AND q.industry_id = #{id}
</if>
WHERE
dict.code = 'serviceTypeDict'
AND dict.is_deleted = 0
<![CDATA[ AND dict.parent_id <> 0 ]]>
GROUP BY
dict.dict_key,
dict.dict_value
ORDER BY
dict.dict_key
GROUP BY
dict.dict_key,
dict.dict_value
ORDER BY
dict.dict_key
</select>
<select id="getExamTableData" resultType="java.util.Map">
<![CDATA[
-- 定义 CTE exam_Count,统计符合条件的考试数量
WITH exam_Count AS (
SELECT COUNT(1) AS "count"
FROM ex_exam_info
WHERE status = 1
AND publish_status = 1
AND is_deleted = 0
),
-- 定义 CTE scores,计算每个考试记录的得分比例和用时
scores AS (
SELECT
score.total_score / papers.total_score AS score,
score.exam_time_spent AS time_spent
FROM
ex_exam_scores score
LEFT JOIN ex_exam_info info ON info.ID = score.exam_id
AND info.publish_status = 1
AND info.is_deleted = 0
LEFT JOIN ex_exam_papers papers ON papers.ID = info.paper_id
AND papers.is_deleted = 0
WHERE
score.is_deleted = 0
)
-- 主查询,统计相关信息
SELECT
1 as "key",
(SELECT "count" FROM exam_Count) AS "examTimes",
(SELECT COUNT(1) FROM scores) AS "participants",
(SELECT AVG(time_spent) FROM scores) AS "averageTime",
ROUND((SELECT COUNT(1) FROM scores WHERE score >= 0.6) * 100.0 / (SELECT COUNT(1) FROM scores), 2) AS "passRate"
]]>
WITH exam_Count AS (
SELECT COUNT(1) AS "count"
FROM ex_exam_info
WHERE status = 1
AND publish_status = 1
AND is_deleted = 0
),
scores AS (
SELECT
score.total_score / papers.total_score AS score,
score.exam_time_spent AS time_spent
FROM
ex_exam_scores score
LEFT JOIN ex_exam_info info ON info.ID = score.exam_id
AND info.publish_status = 1
AND info.is_deleted = 0
LEFT JOIN ex_exam_papers papers ON papers.ID = info.paper_id
AND papers.is_deleted = 0
WHERE
score.is_deleted = 0
)
SELECT
1 AS "key",
(SELECT "count" FROM exam_Count) AS "examTimes",
(SELECT COUNT(1) FROM scores) AS "participants",
(SELECT AVG(time_spent) FROM scores) AS "averageTime",
ROUND(
CASE
WHEN (SELECT COUNT(1) FROM scores) = 0 THEN 0
ELSE (SELECT COUNT(1) FROM scores WHERE score >= 0.6) * 100.0 / (SELECT COUNT(1) FROM scores)
END,
2
) AS "passRate"
</select>
<select id="getScoreDistributionData" resultType="java.util.Map">
<![CDATA[
@ -107,71 +106,78 @@
info.ID
FROM
ex_exam_scores score
LEFT JOIN ex_exam_info info ON info.ID = score.exam_id
AND info.publish_status = 1
AND info.is_deleted = 0
LEFT JOIN ex_exam_papers papers ON papers.ID = info.paper_id
AND papers.is_deleted = 0
LEFT JOIN ex_exam_info info ON info.ID = score.exam_id
AND info.publish_status = 1
AND info.is_deleted = 0
LEFT JOIN ex_exam_papers papers ON papers.ID = info.paper_id
AND papers.is_deleted = 0
WHERE
score.is_deleted = 0
),
-- 定义 CTE total,用于计算总人数
total AS (
SELECT count(1) headcount
FROM
ex_exam_scores score
LEFT JOIN ex_exam_info info ON info.ID = score.exam_id
AND info.publish_status = 1
AND info.is_deleted = 0
LEFT JOIN ex_exam_papers papers ON papers.ID = info.paper_id
AND papers.is_deleted = 0
WHERE
score.is_deleted = 0
)
-- 定义 CTE total,用于计算总人数
total AS (
SELECT COUNT(1) AS headcount
FROM
ex_exam_scores score
LEFT JOIN ex_exam_info info ON info.ID = score.exam_id
AND info.publish_status = 1
AND info.is_deleted = 0
LEFT JOIN ex_exam_papers papers ON papers.ID = info.paper_id
AND papers.is_deleted = 0
WHERE
score.is_deleted = 0
)
-- 主查询部分,计算不同成绩区间的比例并精确到小数点后两位
SELECT
ROUND(COUNT(1) / (SELECT headcount FROM total) * 100, 2) AS "value" ,
'优秀占比: '||ROUND(COUNT(1) / (SELECT headcount FROM total) * 100, 2) || '%' AS "name"
ROUND(COUNT(1) / total.headcount * 100, 2) AS "value",
'优秀占比: ' || ROUND(COUNT(1) / total.headcount * 100, 2) || '%' AS "name"
FROM
scores
scores, total
WHERE
grade >= 0.9
GROUP BY total.headcount
UNION ALL
SELECT
ROUND(COUNT(1) / (SELECT headcount FROM total) * 100, 2) AS "value" ,
'合格占比: '||ROUND(COUNT(1) / (SELECT headcount FROM total) * 100, 2) || '%'AS "name"
ROUND(COUNT(1) / total.headcount * 100, 2) AS "value",
'合格占比: ' || ROUND(COUNT(1) / total.headcount * 100, 2) || '%' AS "name"
FROM
scores
scores, total
WHERE
grade < 0.9
AND grade >= 0.6
AND grade >= 0.6
GROUP BY total.headcount
UNION ALL
SELECT
ROUND(COUNT(1) / (SELECT headcount FROM total) * 100, 2) AS "value" ,
'需努力占比: '||ROUND(COUNT(1) / (SELECT headcount FROM total) * 100, 2) || '%'AS "name"
ROUND(COUNT(1) / total.headcount * 100, 2) AS "value",
'需努力占比: ' || ROUND(COUNT(1) / total.headcount * 100, 2) || '%' AS "name"
FROM
scores
scores, total
WHERE
grade < 0.6;
grade < 0.6
GROUP BY total.headcount;
]]>
</select>
<select id="getPaperDistributionData" resultType="java.util.Map">
SELECT COUNT
( 1 ) AS "value",
ind.industry_name || ': '|| COUNT( 1 ) || ' 套' AS "name"
SELECT
COUNT(1) AS "value",
ind.industry_name || ': ' || COUNT(1) || ' 套' AS "name"
FROM
tbl_industry ind
left join ex_exam_papers papers
on papers.industry_id = ind.industry_id
and papers.is_deleted = 0
AND papers.paper_status = 1
tbl_industry ind
LEFT JOIN ex_exam_papers papers ON papers.industry_id = ind.industry_id
AND papers.is_deleted = 0
WHERE
ind.status = 1
ind.status = 1
AND papers.is_deleted = 0
AND papers.paper_status = 1
GROUP BY
ind.industry_id ,
ind.industry_name
ind.industry_id,
ind.industry_name
ORDER BY
ind.industry_id
ind.industry_id
</select>
<select id="getQuestionTypeDistributionData" resultType="java.util.Map">
with total as (
@ -366,6 +372,7 @@
and score.is_deleted = 0
WHERE
paper.is_deleted = 0
and paper.paper_status = 1
<if test="paperName != null and paperName != ''">
AND paper.paper_name LIKE '%' || #{paperName} || '%'
</if>

Loading…
Cancel
Save