| | |
| | | #{taskId} |
| | | </foreach> |
| | | </if> |
| | | <!-- 传了 subtaskIds 只统计这批子任务(本次导出的患者) --> |
| | | <if test="subtaskIds != null and subtaskIds.size() > 0"> |
| | | AND s.id IN |
| | | <foreach collection="subtaskIds" item="subtaskId" open="(" separator="," close=")"> |
| | | #{subtaskId} |
| | | </foreach> |
| | | </if> |
| | | <if test="valueType != null">AND d.value_type = #{valueType}</if> |
| | | <if test="scoreStart != null">AND d.score >= #{scoreStart}</if> |
| | | <if test="scoreEnd != null">AND d.score <= #{scoreEnd}</if> |
| | |
| | | </if> |
| | | and s.sendstate=6 |
| | | and d.del_flag=0 |
| | | <!-- 分母必须和明细用同一套时间条件,否则选了时间范围后比例会按全量历史被稀释 --> |
| | | <if test="startOutHospTime != null"> |
| | | AND date_format(s.endtime,'%y%m%d') >= date_format(#{startOutHospTime},'%y%m%d') |
| | | </if> |
| | | <if test="endOutHospTime != null"> |
| | | AND date_format(s.endtime,'%y%m%d') <= date_format(#{endOutHospTime},'%y%m%d') |
| | | </if> |
| | | <if test="startFinishTime != null"> |
| | | AND date_format(s.finishtime,'%y%m%d') >= date_format(#{startFinishTime},'%y%m%d') |
| | | </if> |
| | | <if test="endFinishTime != null"> |
| | | AND date_format(s.finishtime,'%y%m%d') <= date_format(#{endFinishTime},'%y%m%d') |
| | | </if> |
| | | GROUP BY |
| | | t.taskid, |
| | | d.questiontext |
| | |
| | | AND t.taskid IN |
| | | <foreach collection="taskIds" item="taskId" open="(" separator="," close=")"> |
| | | #{taskId} |
| | | </foreach> |
| | | </if> |
| | | <if test="subtaskIds != null and subtaskIds.size() > 0"> |
| | | AND s.id IN |
| | | <foreach collection="subtaskIds" item="subtaskId" open="(" separator="," close=")"> |
| | | #{subtaskId} |
| | | </foreach> |
| | | </if> |
| | | <if test="valueType != null">AND d.value_type = #{valueType}</if> |
| | |
| | | t.taskid |
| | | </select> |
| | | |
| | | <!-- |
| | | 导出「问题详情占比」专用统计(只统计本次导出的这批患者) |
| | | 数量 = 选择该选项的患者数(COUNT(DISTINCT s.id),并用 MAX(id) 保证同一患者同一题只算最新一条) |
| | | 分数 = 该选项明细的 score 之和 |
| | | 比例 = 数量 / 该题作答患者数,在 Java 侧统一计算,因此「单题各选项数量之和 = 该题作答患者数」 |
| | | --> |
| | | <select id="statMydQuestionOptionForExport" resultType="com.smartor.domain.DTO.ServiceSubtaskOptionStatDTO"> |
| | | SELECT |
| | | t.taskid AS taskid, |
| | | t.task_name AS taskName, |
| | | d.questiontext AS questiontext, |
| | | d.asrtext AS optionresult, |
| | | d.targetvalue AS targetvalue, |
| | | d.value_type AS valueType, |
| | | COUNT(DISTINCT s.id) AS patientCount, |
| | | SUM(COALESCE(CAST(d.score AS DECIMAL(18,2)), 0)) AS scoreSum |
| | | FROM |
| | | service_task t |
| | | INNER JOIN service_subtask s ON s.taskid = t.taskid |
| | | INNER JOIN service_subtask_detail d ON d.sub_id = s.id |
| | | WHERE 1=1 |
| | | AND s.del_flag = '0' |
| | | AND d.del_flag = 0 |
| | | <if test="subtaskIds != null and subtaskIds.size() > 0"> |
| | | AND s.id IN |
| | | <foreach collection="subtaskIds" item="subtaskId" open="(" separator="," close=")"> |
| | | #{subtaskId} |
| | | </foreach> |
| | | </if> |
| | | <!-- 不传子任务时直接查不到数据,避免误统计全量 --> |
| | | <if test="subtaskIds == null or subtaskIds.size() == 0"> |
| | | AND 1 = 0 |
| | | </if> |
| | | <if test="questiontext != null and questiontext != ''"> |
| | | AND d.questiontext LIKE CONCAT('%', #{questiontext}, '%') |
| | | </if> |
| | | <!-- 同一患者同一题目只保留最新一条,重答不重复计入数量 --> |
| | | AND d.id = ( |
| | | SELECT MAX(d2.id) |
| | | FROM service_subtask_detail d2 |
| | | WHERE d2.sub_id = d.sub_id |
| | | AND d2.questiontext <=> d.questiontext |
| | | AND d2.del_flag = '0' |
| | | ) |
| | | GROUP BY |
| | | t.taskid, |
| | | t.task_name, |
| | | d.questiontext, |
| | | d.asrtext, |
| | | d.targetvalue, |
| | | d.value_type |
| | | <!-- 按任务名称分组展示:先任务名称、再任务编号,同一任务的题目/选项连续排列 --> |
| | | ORDER BY |
| | | t.task_name, |
| | | t.taskid, |
| | | d.questiontext |
| | | </select> |
| | | |
| | | <!-- 新方法:根据子任务 ID 统计问题选项百分比 (用于满意度统计 serviceType=6) --> |
| | | <select id="statQuestionOptionBySubtaskIds" resultType="com.smartor.domain.ServiceSubtaskDetailRatioExport"> |
| | | SELECT |