WITH RECURSIVE date_series AS (
SELECT
id,
team_id,
date_name,
start_time AS work_date,
company_name,
work_status
FROM
ics_declared_work
WHERE
work_status IN ( 'IN_PROGRESS', 'END' )
AND ( start_time LIKE concat( '%', '2025-10', '%' ) OR end_time LIKE concat( '%', '2025-10', '%' ) ) UNION ALL
SELECT
w.id,
w.team_id,
w.date_name,
DATE_ADD( d.work_date, INTERVAL 1 DAY ),
d.company_name,
d.work_status
FROM
date_series d
JOIN ics_declared_work w ON d.id = w.id
WHERE
w.end_time >= DATE_ADD( d.work_date, INTERVAL 1 DAY )
AND w.work_status IN ( 'IN_PROGRESS', 'END' )
AND ( w.start_time LIKE concat( '%', '2025-10', '%' ) OR w.end_time LIKE concat( '%', '2025-10', '%' ) )
),
unit_list AS ( SELECT unit_short_name AS unit_name FROM ics_construction_unit_info WHERE current_status = 1 AND unit_type = '施工单位' ORDER BY sort -- 施工单位
) SELECT
'2025-10' AS `month`,
ul.unit_name AS unitName,
(
SELECT
count(*)
FROM
(
SELECT
CASE
WHEN
date_name IN ( '凌晨,晚上', '晚上,凌晨' ) THEN
DATE_SUB( date( time ), INTERVAL 1 DAY ) ELSE date( time )
END AS time,
m.team_id
FROM
ics_declared_work w
LEFT JOIN ics_after_class_meeting m ON w.team_id = m.team_id
WHERE
w.work_status IN ( 'IN_PROGRESS', 'END' )
AND ( w.start_time LIKE concat( '%', '2025-10', '%' ) OR w.end_time LIKE concat( '%', '2025-10', '%' ) )
AND m.unit_name = ul.unit_name
AND time LIKE concat( '%', '2025-10', '%' )
AND date( time ) BETWEEN date( w.start_time )
AND date( w.end_time )
GROUP BY
CASE
WHEN date_name IN ( '凌晨,晚上', '晚上,凌晨' ) THEN
DATE_SUB( date( time ), INTERVAL 1 DAY ) ELSE date( time )
END,
m.team_id
) a
WHERE
a.time LIKE concat( '%', '2025-10', '%' )
) AS number,
(
SELECT
count(*)
FROM
(
SELECT
CASE
WHEN
date_name IN ( '凌晨,晚上', '晚上,凌晨' ) THEN
DATE_SUB( date( work_date ), INTERVAL 1 DAY ) ELSE date( work_date )
END AS time,
team_id
FROM
date_series
WHERE
work_date LIKE concat( '%', '2025-10', '%' )
AND company_name = ul.unit_name
AND work_status IN ( 'IN_PROGRESS', 'END' )
GROUP BY
CASE
WHEN date_name IN ( '凌晨,晚上', '晚上,凌晨' ) THEN
DATE_SUB( date( work_date ), INTERVAL 1 DAY ) ELSE date( work_date )
END,
team_id
ORDER BY
work_date
) c
) AS necessaryNumber,
COALESCE (
ROUND((
SELECT
count(*)
FROM
(
SELECT
CASE
WHEN
date_name IN ( '凌晨,晚上', '晚上,凌晨' ) THEN
DATE_SUB( date( time ), INTERVAL 1 DAY ) ELSE date( time )
END AS time,
m.team_id
FROM
ics_declared_work w
LEFT JOIN ics_after_class_meeting m ON w.team_id = m.team_id
WHERE
w.work_status IN ( 'IN_PROGRESS', 'END' )
AND ( w.start_time LIKE concat( '%', '2025-10', '%' ) OR w.end_time LIKE concat( '%', '2025-10', '%' ) )
AND m.unit_name = ul.unit_name
AND time LIKE concat( '%', '2025-10', '%' )
AND date( time ) BETWEEN date( w.start_time )
AND date( w.end_time )
GROUP BY
CASE
WHEN date_name IN ( '凌晨,晚上', '晚上,凌晨' ) THEN
DATE_SUB( date( time ), INTERVAL 1 DAY ) ELSE date( time )
END,
m.team_id
) b
)/(
SELECT
count(*)
FROM
(
SELECT
CASE
WHEN
date_name IN ( '凌晨,晚上', '晚上,凌晨' ) THEN
DATE_SUB( date( work_date ), INTERVAL 1 DAY ) ELSE date( work_date )
END AS time,
team_id
FROM
date_series
WHERE
work_date LIKE concat( '%', '2025-10', '%' )
AND company_name = ul.unit_name
AND work_status IN ( 'IN_PROGRESS', 'END' )
GROUP BY
CASE
WHEN date_name IN ( '凌晨,晚上', '晚上,凌晨' ) THEN
DATE_SUB( date( work_date ), INTERVAL 1 DAY ) ELSE date( work_date )
END,
team_id
ORDER BY
work_date
) c
)* 100,
2
),
0
) AS rate
FROM
unit_list ul;帮我优化入参将2025-10替换为#{month}