частично изменил алгоритм для main_dashboard.waiting_registration

This commit is contained in:
Ruslan 2025-03-07 17:55:04 +03:00
parent ab13fad070
commit 44524126eb
5 changed files with 405 additions and 1392 deletions

View file

@ -237,166 +237,122 @@
<connection>ervu_person_registry</connection>
<execute_each_row>N</execute_each_row>
<limit>0</limit>
<sql>WITH
<sql>WITH
ids AS (
SELECT unnest(string_to_array(trim(both '{}' from '${ARR_MC}'), ','))::uuid AS recruitment_id
),
convicts_separations AS (
SELECT 'CONVICT' AS convicts
UNION ALL
SELECT 'NOTCONVICT' AS convicts
UNION ALL
SELECT 'ALL' AS convicts
),
data_combinations AS (
SELECT
i.recruitment_id AS recruitment_id,
cs.convicts
FROM ids i
CROSS JOIN convicts_separations cs
),
last_status as (select recruit_id,
max(date_time) filter (where status not in ('1', '1.3', '12', '12.1', '12.2', '12.3', '12.4', '12.5', '13')) max_date_time
from recruits_history
where status not in ('1', '1.3', '12', '12.1', '12.2', '12.3', '12.4', '12.5', '13')
group by recruit_id),
registered as (
select
distinct rh.recruit_id,
rh.id as recruit_history_id
from recruits_history rh
join last_status ls on rh.recruit_id=ls. recruit_id and rh.date_time=ls.max_date_time
where rh.status not in ('1', '1.3', '12', '12.1', '12.2', '12.3', '12.4', '12.5', '13')
--and rh.source is not null
) ,
vse AS (
SELECT
SELECT
distinct
r.id AS r_id,
ri.recruit_id AS recruit_id,
r.target_recruitment_id AS r_target_recruitment_id,
r.vu_current_info,
r.current_recruitment_id,
CASE
WHEN r.vu_current_info->>'recruitmentCommercialInfo' = 'true' THEN 'CONVICT'
ELSE 'ALL'
END AS convicts,
coalesce (r.current_recruitment_id, rh.current_recruitment_id) AS r_current_recruitment_id,
r.gender,
r.birth_date,
r.conscription,
ri.info,
CASE
WHEN r.vu_current_info->>'recruitmentCommercialInfo' = 'true' THEN 'CONVICT'
WHEN r.vu_current_info->>'recruitmentCommercialInfo' = 'false' THEN 'NOTCONVICT'
ELSE 'NOTCONVICT'
END AS sidit
FROM
public.recruits AS r
JOIN
public.recruits_info AS ri
ON
ri.recruit_id = r.id
WHERE
r.vu_current_info ->> 'isMilitaryRegistered' = 'true'
AND r.current_recruitment_id IS NOT NULL
AND r.target_recruitment_id::uuid IN (SELECT recruitment_id FROM ids)
ri.info
FROM public.recruits AS r
JOIN public.recruits_info AS ri
ON ri.recruit_id = r.id
join public.recruits_history rh on rh.recruit_id=r.id
WHERE
r.id in (SELECT recruit_id FROM registered) and
rh.id in (SELECT recruit_history_id FROM registered) and
coalesce(r.current_recruitment_id,rh.current_recruitment_id) ::uuid IN (SELECT recruitment_id FROM ids)
),
extracted_children AS (
SELECT
ri.recruit_id,
jsonb_array_elements_text(ri.info->'svedDeti'->'rebenok') AS child
FROM
vse ri
WHERE
jsonb_typeof(ri.info->'svedDeti'->'rebenok') = 'array'
),
children_birth_dates AS (
SELECT
recruit_id,
(child::jsonb->'svedFLBS'->'dataRozhdDok'->>'den')::int AS day,
(child::jsonb->'svedFLBS'->'dataRozhdDok'->>'mesyacz')::int AS month,
(child::jsonb->'svedFLBS'->'dataRozhdDok'->>'god')::int AS year
FROM
extracted_children
),
children_count AS (
SELECT
recruit_id,
COUNT(*) AS children_under_16
FROM
children_birth_dates
WHERE
AGE(make_date(year, month, day)) &lt; interval '16 years'
GROUP BY
recruit_id
),
recruit_data AS (
extracted_children AS (
SELECT
ri.r_target_recruitment_id::uuid AS recruitment_id,
ri.sidit AS convicts,
COUNT(*) AS total_count,
COUNT(*) FILTER (WHERE gender = 'MALE') AS male_count,
COUNT(*) FILTER (WHERE gender = 'FEMALE') AS female_count,
COUNT(*) FILTER (
WHERE (EXTRACT(YEAR FROM AGE(NOW(), birth_date)) BETWEEN 18 AND 70
AND gender = 'MALE')
OR (EXTRACT(YEAR FROM AGE(NOW(), birth_date)) BETWEEN 18 AND 45
AND gender = 'FEMALE')
AND (conscription IS NULL OR conscription = false)
AND COALESCE(cc.children_under_16, 0) &lt; 5
) AS mobilization_criterion,
COUNT(*) FILTER (
WHERE EXTRACT(YEAR FROM AGE(NOW(), birth_date)) BETWEEN 18 AND 30
AND gender = 'MALE'
AND (conscription IS NULL OR conscription = false)
) AS volunteer_criterion,
COUNT(*) FILTER (
WHERE EXTRACT(YEAR FROM AGE(NOW(), birth_date)) BETWEEN 18 AND 50
AND gender = 'MALE'
AND (conscription IS NULL OR conscription = false)
AND ri.info->'svedSudim'->>'prOtsSvedSudim' = '1'
ri.recruit_id,
jsonb_array_elements_text(ri.info->'svedDeti'->'rebenok') AS child
FROM vse ri
WHERE jsonb_typeof(ri.info->'svedDeti'->'rebenok') = 'array'
),
children_birth_dates AS (
SELECT
recruit_id,
(child::jsonb->'svedFLBS'->'dataRozhdDok'->>'den')::int AS day,
(child::jsonb->'svedFLBS'->'dataRozhdDok'->>'mesyacz')::int AS month,
(child::jsonb->'svedFLBS'->'dataRozhdDok'->>'god')::int AS year
FROM extracted_children
),
children_count AS (
SELECT
recruit_id,
COUNT(*) AS children_under_16
FROM children_birth_dates
WHERE AGE(make_date(year, month, day)) &lt; interval '16 years'
GROUP BY recruit_id
),
recruit_data AS (
SELECT
ri.r_current_recruitment_id::uuid AS recruitment_id,
ri.convicts,
COUNT(*) AS total_count,
COUNT(*) FILTER (WHERE gender = 'MALE') AS male_count,
COUNT(*) FILTER (WHERE gender = 'FEMALE') AS female_count,
COUNT(*) FILTER (
WHERE (EXTRACT(YEAR FROM AGE(NOW(), birth_date)) BETWEEN 18 AND 70 AND gender = 'MALE')
OR (EXTRACT(YEAR FROM AGE(NOW(), birth_date)) BETWEEN 18 AND 45 AND gender = 'FEMALE')
AND (conscription IS NULL OR conscription = false)
AND COALESCE(cc.children_under_16, 0) &lt; 5
) AS mobilization_criterion,
COUNT(*) FILTER (
WHERE EXTRACT(YEAR FROM AGE(NOW(), birth_date)) BETWEEN 18 AND 30
AND gender = 'MALE'
AND (conscription IS NULL OR conscription = false)
) AS volunteer_criterion,
COUNT(*) FILTER (
WHERE EXTRACT(YEAR FROM AGE(NOW(), birth_date)) BETWEEN 18 AND 50
AND gender = 'MALE'
AND (conscription IS NULL OR conscription = false)
AND ri.info->'svedSudim'->>'prOtsSvedSudim' = '1'
) AS contract_criterion
FROM
vse AS ri
LEFT JOIN
children_count AS cc
ON
ri.recruit_id = cc.recruit_id
GROUP BY
ri.r_target_recruitment_id, ri.sidit
),
recruit_data_all AS(
SELECT
'ALL' AS convicts,
recruitment_id,
SUM(total_count) AS total_count,
SUM(male_count) AS male_count,
SUM(female_count) AS female_count,
SUM(mobilization_criterion) AS mobilization_criterion,
SUM(volunteer_criterion) AS volunteer_criterion,
SUM(contract_criterion) AS contract_criterion
FROM recruit_data
GROUP BY recruitment_id
FROM vse AS ri
LEFT JOIN children_count AS cc ON ri.recruit_id = cc.recruit_id
GROUP BY ri.r_current_recruitment_id, ri.convicts
)
SELECT
dc.recruitment_id,
dc.convicts,
current_date AS recording_date,
COALESCE(rd.total_count, rda.total_count, 0) AS total_count,
COALESCE(rd.male_count, rda.male_count, 0) AS male_count,
COALESCE(rd.female_count, rda.female_count, 0) AS female_count,
COALESCE(rd.mobilization_criterion, rda.mobilization_criterion, 0) AS mobilization_criterion,
COALESCE(rd.volunteer_criterion, rda.volunteer_criterion, 0) AS volunteer_criterion,
COALESCE(rd.contract_criterion, rda.contract_criterion, 0) AS contract_criterion,
CASE
WHEN COALESCE(rd.total_count, rda.total_count, 0) > 0
THEN ROUND(COALESCE(rd.mobilization_criterion, rda.mobilization_criterion, 0)::NUMERIC
/ COALESCE(rd.total_count, rda.total_count, 0) * 100, 2)
ELSE 0
END AS mobilization_criterion_percent,
CASE
WHEN COALESCE(rd.total_count, rda.total_count, 0) > 0
THEN ROUND(COALESCE(rd.volunteer_criterion, rda.volunteer_criterion, 0)::NUMERIC
/ COALESCE(rd.total_count, rda.total_count, 0) * 100, 2)
ELSE 0
END AS volunteer_criterion_percent,
CASE
WHEN COALESCE(rd.total_count, rda.total_count, 0) > 0
THEN ROUND(COALESCE(rd.contract_criterion, rda.contract_criterion, 0)::NUMERIC
/ COALESCE(rd.total_count, rda.total_count, 0) * 100, 2)
ELSE 0
END AS contract_criterion_percent
FROM
data_combinations dc
FULL OUTER JOIN recruit_data rd
ON dc.recruitment_id = rd.recruitment_id
AND dc.convicts = rd.convicts
AND dc.convicts IN ('CONVICT', 'NOTCONVICT')
FULL OUTER JOIN recruit_data_all rda
ON dc.recruitment_id = rda.recruitment_id
AND dc.convicts = rda.convicts
AND dc.convicts = 'ALL';</sql>
SELECT
ids.recruitment_id,
rd.convicts,
current_date AS recording_date,
COALESCE(rd.total_count, 0) AS total_count,
COALESCE(rd.male_count, 0) AS male_count,
COALESCE(rd.female_count, 0) AS female_count,
COALESCE(rd.mobilization_criterion, 0) AS mobilization_criterion,
COALESCE(rd.volunteer_criterion, 0) AS volunteer_criterion,
COALESCE(rd.contract_criterion, 0) AS contract_criterion,
CASE
WHEN rd.total_count > 0 THEN ROUND(rd.mobilization_criterion::NUMERIC / rd.total_count * 100, 2)
ELSE 0
END AS mobilization_criterion_percent,
CASE
WHEN rd.total_count > 0 THEN ROUND(rd.volunteer_criterion::NUMERIC / rd.total_count * 100, 2)
ELSE 0
END AS volunteer_criterion_percent,
CASE
WHEN rd.total_count > 0 THEN ROUND(rd.contract_criterion::NUMERIC / rd.total_count * 100, 2)
ELSE 0
END AS contract_criterion_percent
FROM ids
JOIN recruit_data AS rd ON ids.recruitment_id = rd.recruitment_id</sql>
<variables_active>Y</variables_active>
<attributes/>
<GUI>

View file

@ -236,106 +236,123 @@
ids AS (
SELECT unnest(string_to_array(trim(both '{}' from '${ARR_MC}'), ','))::uuid AS recruitment_id
),
last_status as (select recruit_id,
max(date_time) filter (where status in ('1', '12.7', '8.2', '8.3')) max_date_time
from recruits_history
where status in ('1', '12.7', '8.2', '8.3')
group by recruit_id),
notregistered as (
select
distinct rh.recruit_id,
rh.id as recruit_history_id
from recruits_history rh
join last_status ls on rh.recruit_id=ls. recruit_id and rh.date_time=ls.max_date_time
where rh.status in ('1', '12.7', '8.2', '8.3')
--and rh.source is not null
),
total_recruits AS (
SELECT COUNT(*) AS total_count
SELECT COUNT(distinct r.id) AS total_count
FROM public.recruits AS r
JOIN public.recruits_info AS ri
ON ri.recruit_id = r.id
WHERE r.vu_current_info ->> 'isMilitaryRegistered' = 'false'
AND r.target_recruitment_id::uuid IN (SELECT recruitment_id FROM ids)
join public.recruits_history rh on rh.recruit_id=r.id
WHERE
r.id in (SELECT recruit_id FROM notregistered) and
coalesce(r.target_recruitment_id,rh.target_recruitment_id) ::uuid IN (SELECT recruitment_id FROM ids)
AND r.current_recruitment_id is null
),
vse AS (
SELECT
r.id AS r_id,
ri.recruit_id AS recruit_id,
r.target_recruitment_id AS r_target_recruitment_id,
r.vu_current_info,
r.current_recruitment_id,
r.gender,
r.birth_date,
r.conscription,
ri.info
SELECT
distinct
r.id AS r_id,
ri.recruit_id AS recruit_id,
coalesce (r.target_recruitment_id, rh.target_recruitment_id) AS r_target_recruitment_id,
r.gender,
r.birth_date,
r.conscription,
ri.info
FROM public.recruits AS r
JOIN public.recruits_info AS ri
JOIN public.recruits_info AS ri
ON ri.recruit_id = r.id
WHERE r.vu_current_info ->> 'isMilitaryRegistered' = 'false'
AND r.target_recruitment_id::uuid IN (SELECT recruitment_id FROM ids)
join public.recruits_history rh on rh.recruit_id=r.id
WHERE
r.id in (SELECT recruit_id FROM notregistered) and
rh.id in (SELECT recruit_history_id FROM notregistered) and
coalesce(r.target_recruitment_id,rh.target_recruitment_id) ::uuid IN (SELECT recruitment_id FROM ids)
AND r.current_recruitment_id is null
),
extracted_children AS (
SELECT
ri.recruit_id,
jsonb_array_elements_text(ri.info->'svedDeti'->'rebenok') AS child
FROM vse ri
SELECT
ri.recruit_id,
jsonb_array_elements_text(ri.info->'svedDeti'->'rebenok') AS child
FROM vse ri
WHERE jsonb_typeof(ri.info->'svedDeti'->'rebenok') = 'array'
),
children_birth_dates AS (
SELECT
recruit_id,
(child::jsonb->'svedFLBS'->'dataRozhdDok'->>'den')::int AS day,
(child::jsonb->'svedFLBS'->'dataRozhdDok'->>'mesyacz')::int AS month,
(child::jsonb->'svedFLBS'->'dataRozhdDok'->>'god')::int AS year
FROM extracted_children
),
children_count AS (
SELECT
recruit_id,
COUNT(*) AS children_under_16
FROM children_birth_dates
WHERE AGE(make_date(year, month, day)) &lt; interval '16 years'
GROUP BY recruit_id
),
recruit_data AS (
SELECT
ri.r_target_recruitment_id::uuid AS recruitment_id,
COUNT(*) AS waiting_count,
COUNT(*) FILTER (WHERE gender = 'MALE') AS male_count,
COUNT(*) FILTER (WHERE gender = 'FEMALE') AS female_count,
COUNT(*) FILTER (
WHERE (EXTRACT(YEAR FROM AGE(NOW(), birth_date)) BETWEEN 18 AND 70 AND gender = 'MALE')
OR (EXTRACT(YEAR FROM AGE(NOW(), birth_date)) BETWEEN 18 AND 45 AND gender = 'FEMALE')
AND (conscription IS NULL OR conscription = false)
AND COALESCE(cc.children_under_16, 0) &lt; 5
) AS mobilization_criterion,
COUNT(*) FILTER (
WHERE EXTRACT(YEAR FROM AGE(NOW(), birth_date)) BETWEEN 18 AND 30
AND gender = 'MALE'
AND (conscription IS NULL OR conscription = false)
) AS volunteer_criterion,
COUNT(*) FILTER (
WHERE EXTRACT(YEAR FROM AGE(NOW(), birth_date)) BETWEEN 18 AND 50
AND gender = 'MALE'
AND (conscription IS NULL OR conscription = false)
AND ri.info->'svedSudim'->>'prOtsSvedSudim' = '1'
) AS contract_criterion
),
children_birth_dates AS (
SELECT
recruit_id,
(child::jsonb->'svedFLBS'->'dataRozhdDok'->>'den')::int AS day,
(child::jsonb->'svedFLBS'->'dataRozhdDok'->>'mesyacz')::int AS month,
(child::jsonb->'svedFLBS'->'dataRozhdDok'->>'god')::int AS year
FROM extracted_children
),
children_count AS (
SELECT
recruit_id,
COUNT(*) AS children_under_16
FROM children_birth_dates
WHERE AGE(make_date(year, month, day)) &lt; interval '16 years'
GROUP BY recruit_id
),
recruit_data AS (
SELECT
ri.r_target_recruitment_id::uuid AS recruitment_id,
COUNT(*) AS waiting_count,
COUNT(*) FILTER (WHERE gender = 'MALE') AS male_count,
COUNT(*) FILTER (WHERE gender = 'FEMALE') AS female_count,
COUNT(*) FILTER (
WHERE (EXTRACT(YEAR FROM AGE(NOW(), birth_date)) BETWEEN 18 AND 70 AND gender = 'MALE')
OR (EXTRACT(YEAR FROM AGE(NOW(), birth_date)) BETWEEN 18 AND 45 AND gender = 'FEMALE')
AND (conscription IS NULL OR conscription = false)
AND COALESCE(cc.children_under_16, 0) &lt; 5
) AS mobilization_criterion,
COUNT(*) FILTER (
WHERE EXTRACT(YEAR FROM AGE(NOW(), birth_date)) BETWEEN 18 AND 30
AND gender = 'MALE'
AND (conscription IS NULL OR conscription = false)
) AS volunteer_criterion,
COUNT(*) FILTER (
WHERE EXTRACT(YEAR FROM AGE(NOW(), birth_date)) BETWEEN 18 AND 50
AND gender = 'MALE'
AND (conscription IS NULL OR conscription = false)
AND ri.info->'svedSudim'->>'prOtsSvedSudim' = '1'
) AS contract_criterion
FROM vse AS ri
LEFT JOIN children_count AS cc ON ri.recruit_id = cc.recruit_id
GROUP BY ri.r_target_recruitment_id
)
SELECT
ids.recruitment_id,
SELECT
rd.recruitment_id,
current_date AS recording_date,
COALESCE(rd.waiting_count, 0) AS waiting_count,
COALESCE(rd.male_count, 0) AS male_count,
COALESCE(rd.female_count, 0) AS female_count,
COALESCE(rd.mobilization_criterion, 0) AS mobilization_criterion,
COALESCE(rd.volunteer_criterion, 0) AS volunteer_criterion,
COALESCE(rd.contract_criterion, 0) AS contract_criterion,
CASE
WHEN rd.waiting_count > 0 THEN ROUND(rd.mobilization_criterion::NUMERIC / rd.waiting_count * 100, 2)
ELSE 0
END AS mobilization_criterion_percent,
CASE
WHEN rd.waiting_count > 0 THEN ROUND(rd.volunteer_criterion::NUMERIC / rd.waiting_count * 100, 2)
ELSE 0
END AS volunteer_criterion_percent,
CASE
WHEN rd.waiting_count > 0 THEN ROUND(rd.contract_criterion::NUMERIC / rd.waiting_count * 100, 2)
ELSE 0
COALESCE(rd.waiting_count, 0) AS waiting_count,
COALESCE(rd.male_count, 0) AS male_count,
COALESCE(rd.female_count, 0) AS female_count,
COALESCE(rd.mobilization_criterion, 0) AS mobilization_criterion,
COALESCE(rd.volunteer_criterion, 0) AS volunteer_criterion,
COALESCE(rd.contract_criterion, 0) AS contract_criterion,
CASE
WHEN rd.waiting_count > 0 THEN ROUND(rd.mobilization_criterion::NUMERIC / rd.waiting_count * 100, 2)
ELSE 0
END AS mobilization_criterion_percent,
CASE
WHEN rd.waiting_count > 0 THEN ROUND(rd.volunteer_criterion::NUMERIC / rd.waiting_count * 100, 2)
ELSE 0
END AS volunteer_criterion_percent,
CASE
WHEN rd.waiting_count > 0 THEN ROUND(rd.contract_criterion::NUMERIC / rd.waiting_count * 100, 2)
ELSE 0
END AS contract_criterion_percent,
ROUND(COALESCE((rd.waiting_count::DECIMAL / NULLIF(total_recruits.total_count, 0) * 100), 0), 2) AS waiting_percent
FROM ids
LEFT JOIN recruit_data AS rd ON ids.recruitment_id = rd.recruitment_id
CROSS JOIN total_recruits;</sql>
FROM recruit_data AS rd
CROSS JOIN total_recruits</sql>
<variables_active>Y</variables_active>
<attributes/>
<GUI>

View file

@ -41,26 +41,6 @@
<to>Insert / update (total_registered.busyness) 2</to>
<enabled>Y</enabled>
</hop>
<hop>
<from>Get variables 3 2 2 2</from>
<to>Select values 3 2 2 2</to>
<enabled>N</enabled>
</hop>
<hop>
<from>Select values 3 2 2 2</from>
<to>Insert / update (total_registered.busyness) 2 2</to>
<enabled>N</enabled>
</hop>
<hop>
<from>Table input (person_registry) РФ/мужчины 2</from>
<to>Get variables 3 2 2 2</to>
<enabled>N</enabled>
</hop>
<hop>
<from>Table input (person_registry) РФ/мужчины 2</from>
<to>Insert / update (total_registered.busyness) 2 2</to>
<enabled>N</enabled>
</hop>
</order>
<transform>
<name>Get variables 3 2 2</name>
@ -95,39 +75,6 @@
<yloc>624</yloc>
</GUI>
</transform>
<transform>
<name>Get variables 3 2 2 2</name>
<type>GetVariable</type>
<description/>
<distribute>Y</distribute>
<custom_distribution/>
<copies>1</copies>
<partitioning>
<method>none</method>
<schema_name/>
</partitioning>
<fields>
<field>
<length>-1</length>
<name>REC_ID</name>
<precision>-1</precision>
<trim_type>none</trim_type>
<type>String</type>
</field>
<field>
<length>-1</length>
<name>SCM</name>
<precision>-1</precision>
<trim_type>none</trim_type>
<type>String</type>
</field>
</fields>
<attributes/>
<GUI>
<xloc>1568</xloc>
<yloc>800</yloc>
</GUI>
</transform>
<transform>
<name>Insert / update (total_registered.busyness) 2</name>
<type>InsertUpdate</type>
@ -232,110 +179,6 @@
<yloc>544</yloc>
</GUI>
</transform>
<transform>
<name>Insert / update (total_registered.busyness) 2 2</name>
<type>InsertUpdate</type>
<description/>
<distribute>Y</distribute>
<custom_distribution/>
<copies>1</copies>
<partitioning>
<method>none</method>
<schema_name/>
</partitioning>
<commit>100</commit>
<connection>ervu-dashboard</connection>
<lookup>
<key>
<condition>=</condition>
<field>recruitment_id</field>
<name>recruitment_id</name>
</key>
<key>
<condition>=</condition>
<field>"all_M_W"</field>
<name>gender</name>
</key>
<key>
<condition>=</condition>
<field>registered</field>
<name>registered</name>
</key>
<key>
<condition>=</condition>
<field>recording_date</field>
<name>recording_date</name>
</key>
<key>
<condition>=</condition>
<field>convicts</field>
<name>convicts</name>
</key>
<schema>total_registered</schema>
<table>busyness</table>
<value>
<name>study</name>
<rename>study</rename>
<update>Y</update>
</value>
<value>
<name>work</name>
<rename>work</rename>
<update>Y</update>
</value>
<value>
<name>study_percent</name>
<rename>study_percent</rename>
<update>Y</update>
</value>
<value>
<name>work_percent</name>
<rename>work_percent</rename>
<update>Y</update>
</value>
<value>
<name>recruitment_id</name>
<rename>recruitment_id</rename>
<update>N</update>
</value>
<value>
<name>registered</name>
<rename>registered</rename>
<update>N</update>
</value>
<value>
<name>"all_M_W"</name>
<rename>gender</rename>
<update>N</update>
</value>
<value>
<name>not_work</name>
<rename>no_info</rename>
<update>Y</update>
</value>
<value>
<name>not_work_percent</name>
<rename>no_info_percent</rename>
<update>Y</update>
</value>
<value>
<name>busyness</name>
<rename>total_people</rename>
<update>Y</update>
</value>
<value>
<name>convicts</name>
<rename>convicts</rename>
<update>N</update>
</value>
</lookup>
<update_bypassed>Y</update_bypassed>
<attributes/>
<GUI>
<xloc>1968</xloc>
<yloc>720</yloc>
</GUI>
</transform>
<transform>
<name>Select values 3 2 2</name>
<type>SelectValues</type>
@ -390,60 +233,6 @@
<yloc>624</yloc>
</GUI>
</transform>
<transform>
<name>Select values 3 2 2 2</name>
<type>SelectValues</type>
<description/>
<distribute>Y</distribute>
<custom_distribution/>
<copies>1</copies>
<partitioning>
<method>none</method>
<schema_name/>
</partitioning>
<fields>
<select_unspecified>N</select_unspecified>
<meta>
<name>REC_ID</name>
<rename>REC_ID</rename>
<type>String</type>
<length>-2</length>
<precision>-2</precision>
<conversion_mask/>
<date_format_lenient>false</date_format_lenient>
<date_format_locale/>
<date_format_timezone/>
<lenient_string_to_number>false</lenient_string_to_number>
<encoding/>
<decimal_symbol/>
<grouping_symbol/>
<currency_symbol/>
<storage_type/>
</meta>
<meta>
<name>SCM</name>
<rename>SCM</rename>
<type>String</type>
<length>-2</length>
<precision>-2</precision>
<conversion_mask/>
<date_format_lenient>false</date_format_lenient>
<date_format_locale/>
<date_format_timezone/>
<lenient_string_to_number>false</lenient_string_to_number>
<encoding/>
<decimal_symbol/>
<grouping_symbol/>
<currency_symbol/>
<storage_type/>
</meta>
</fields>
<attributes/>
<GUI>
<xloc>1712</xloc>
<yloc>800</yloc>
</GUI>
</transform>
<transform>
<name>Table input (person_registry) РФ/мужчины</name>
<type>TableInput</type>
@ -460,10 +249,42 @@
<limit>0</limit>
<sql>WITH
ids AS (
-- Преобразуем строковый массив в таблицу UUID
SELECT unnest(string_to_array(trim(both '{}' from '${ARR_MC}'), ','))::uuid AS recruitment_id
),
last_status_r as (select recruit_id,
max(date_time) filter (where status not in ('1', '1.3', '12', '12.1', '12.2', '12.3', '12.4', '12.5', '13')) max_date_time
from recruits_history
where status not in ('1', '1.3', '12', '12.1', '12.2', '12.3', '12.4', '12.5', '13')
group by recruit_id
),
registered as (
select
distinct rh.recruit_id,
rh.id as recruit_history_id
from recruits_history rh
join last_status_r ls on rh.recruit_id=ls.recruit_id and rh.date_time=ls.max_date_time
where rh.status not in ('1', '1.3', '12', '12.1', '12.2', '12.3', '12.4', '12.5', '13')
--and rh.source is not null
),
last_status_n as (select recruit_id,
max(date_time) filter (where status in ('1', '1.1', '12.2', '12.10')) max_date_time
from recruits_history
where status in ('1', '1.1', '12.2', '12.10')
group by recruit_id
),
notregistered as (
select
distinct rh.recruit_id,
rh.id as recruit_history_id
from recruits_history rh
join last_status_n ls on rh.recruit_id=ls. recruit_id and rh.date_time=ls.max_date_time
where rh.status in ('1', '1.1', '12.2', '12.10')
--and rh.source is not null
),
status_info AS (
SELECT
r.id AS recruit_id,
-- Проверка на обучение в вузе (есть информация и обучается)
(
CASE
@ -502,6 +323,7 @@ status_info AS (
ELSE false
END
) AS is_working,
-- Проверка на отсутствие сведений о вузе
info->'svedVUZ'->>'prOtsSvedVUZ' = '1' AS no_info_vuz,
@ -510,17 +332,86 @@ status_info AS (
-- Проверка на отсутствие сведений о работе
info->'svedTrud'->>'prOtsSvedTrud' = '1' AS no_info_work,
r.target_recruitment_id AS recruitment_id,
coalesce (r.current_recruitment_id, rh.current_recruitment_id) AS recruitment_id,
r.gender,
r.vu_current_info -> 'isMilitaryRegistered' AS registered--,
--r.vu_current_info->>'recruitmentCommercialInfo' AS sidit
FROM public.recruits_info ri
JOIN public.recruits r ON ri.recruit_id = r.id
WHERE r.vu_current_info -> 'isMilitaryRegistered' IN ('true', 'false')
AND r.gender IN ('MALE', 'FEMALE')
AND r.current_recruitment_id IS NOT NULL
AND r.target_recruitment_id::uuid IN (SELECT recruitment_id FROM ids)
--AND r.vu_current_info->>'recruitmentCommercialInfo' = 'true' -- осужденные
CASE
WHEN r.vu_current_info->>'recruitmentCommercialInfo' = 'true' THEN 'CONVICT'
ELSE 'ALL'
END AS convicts,
'true' AS registered
FROM public.recruits AS r
JOIN public.recruits_info AS ri ON ri.recruit_id = r.id
JOIN public.recruits_history AS rh on rh.recruit_id = r.id
WHERE
r.id in (SELECT recruit_id FROM registered)
AND rh.id in (SELECT recruit_history_id FROM registered)
--and r.vu_current_info->>'recruitmentCommercialInfo' = 'true'
AND coalesce(r.current_recruitment_id,rh.current_recruitment_id) ::uuid IN (SELECT recruitment_id FROM ids)
UNION ALL
SELECT
r.id AS recruit_id,
-- Проверка на обучение в вузе (есть информация и обучается)
(
CASE
WHEN jsonb_typeof(info->'svedVUZ'->'vuz') = 'array' THEN
EXISTS (
SELECT 1
FROM jsonb_array_elements(info->'svedVUZ'->'vuz') AS vuz
WHERE vuz->>'kodStatus' = '1'
)
ELSE false
END
) AS is_studying_in_vuz,
-- Проверка на обучение в колледже (есть информация и обучается)
(
CASE
WHEN jsonb_typeof(info->'svedKolledzh'->'kolledzh') = 'array' THEN
EXISTS (
SELECT 1
FROM jsonb_array_elements(info->'svedKolledzh'->'kolledzh') AS kolledzh
WHERE kolledzh->>'kodStatus' = '1'
)
ELSE false
END
) AS is_studying_in_college,
-- Проверка на работу (есть информация и работает)
(
CASE
WHEN jsonb_typeof(info->'svedTrud'->'trudDeyat') = 'array' THEN
EXISTS (
SELECT 1
FROM jsonb_array_elements(info->'svedTrud'->'trudDeyat') AS trud
WHERE trud->>'prAktMestRab' = '1'
)
ELSE false
END
) AS is_working,
-- Проверка на отсутствие сведений о вузе
info->'svedVUZ'->>'prOtsSvedVUZ' = '1' AS no_info_vuz,
-- Проверка на отсутствие сведений о колледже
info->'svedKolledzh'->>'prOtsSvedKolledzh' = '1' AS no_info_college,
-- Проверка на отсутствие сведений о работе
info->'svedTrud'->>'prOtsSvedTrud' = '1' AS no_info_work,
coalesce (r.target_recruitment_id, rh.target_recruitment_id) AS recruitment_id,
r.gender,
CASE
WHEN r.vu_current_info->>'recruitmentCommercialInfo' = 'true' THEN 'CONVICT'
ELSE 'ALL'
END AS convicts,
'false' AS registered
FROM public.recruits AS r
JOIN public.recruits_info AS ri ON ri.recruit_id = r.id
JOIN public.recruits_history AS rh on rh.recruit_id = r.id
WHERE
r.id in (SELECT recruit_id FROM notregistered)
AND rh.id in (SELECT recruit_history_id FROM notregistered)
--and r.vu_current_info->>'recruitmentCommercialInfo' = 'true'
AND coalesce(r.target_recruitment_id,rh.target_recruitment_id) ::uuid IN (SELECT recruitment_id FROM ids)
),
summary AS (
SELECT
@ -529,6 +420,7 @@ summary AS (
WHEN si.gender = 'MALE' THEN 'M'
ELSE 'W'
END AS gender,
si.convicts,
si.registered,
-- Количество людей, которые учатся (в вузе или колледже)
COUNT(CASE WHEN is_studying_in_vuz OR is_studying_in_college THEN 1 END) AS study,
@ -540,28 +432,26 @@ summary AS (
COUNT(CASE WHEN no_info_vuz AND no_info_college AND no_info_work THEN 1 END) AS no_info,
-- Общее количество людей
COUNT(si.recruitment_id) AS total_people
--COUNT(CASE WHEN sidit = 'true' THEN 1 END) AS convicts
COUNT(si.recruit_id) AS total_people
FROM status_info si
GROUP BY si.recruitment_id, si.gender, si.registered
GROUP BY si.recruitment_id, si.gender, si.registered, si.convicts
),
summary_all AS (
SELECT
recruitment_id,
registered,
convicts,
'ALL' AS gender,
SUM(study) AS study,
SUM(work) AS work,
SUM(no_info) AS no_info,
SUM(total_people) AS total_people--,
--SUM(convicts) AS convicts
SUM(total_people) AS total_people
FROM summary
GROUP BY recruitment_id, registered
GROUP BY recruitment_id, registered, convicts
)
SELECT
current_date AS recording_date,
s.convicts,
s.gender,
s.registered,
s.recruitment_id,
@ -569,23 +459,20 @@ SELECT
s.work,
s.no_info,
s.total_people,
'ALL' AS convicts,
-- Процент людей, которые учатся
COALESCE(ROUND(s.study * 100.0 / NULLIF(s.total_people, 0), 2), 0.0) AS study_percent,
ROUND(s.study * 100.0 / NULLIF(s.total_people, 0), 2) AS study_percent,
-- Процент людей, которые работают
COALESCE(ROUND(s.work * 100.0 / NULLIF(s.total_people, 0), 2), 0.0) AS work_percent,
ROUND(s.work * 100.0 / NULLIF(s.total_people, 0), 2) AS work_percent,
-- Процент людей, для которых отсутствуют сведения
COALESCE(ROUND(s.no_info * 100.0 / NULLIF(s.total_people, 0), 2), 0.0) AS no_info_percent--,
--COALESCE(ROUND(s.convicts * 100.0 / NULLIF((select sum(convicts) from summary_all), 0), 2), 0.0) AS convicts_percent
ROUND(s.no_info * 100.0 / NULLIF(s.total_people, 0), 2) AS no_info_percent
FROM summary s
UNION ALL
SELECT
current_date AS recording_date,
sa.convicts,
sa.gender,
sa.registered,
sa.recruitment_id,
@ -593,17 +480,15 @@ SELECT
sa.work,
sa.no_info,
sa.total_people,
'ALL' AS convicts,
-- Процент людей, которые учатся
COALESCE(ROUND(sa.study * 100.0 / NULLIF(sa.total_people, 0), 2), 0.0) AS study_percent,
ROUND(sa.study * 100.0 / NULLIF(sa.total_people, 0), 2) AS study_percent,
-- Процент людей, которые работают
COALESCE(ROUND(sa.work * 100.0 / NULLIF(sa.total_people, 0), 2), 0.0) AS work_percent,
ROUND(sa.work * 100.0 / NULLIF(sa.total_people, 0), 2) AS work_percent,
-- Процент людей, для которых отсутствуют сведения
COALESCE(ROUND(sa.no_info * 100.0 / NULLIF(sa.total_people, 0), 2), 0.0) AS no_info_percent--,
--'0.0' AS convicts_percent
ROUND(sa.no_info * 100.0 / NULLIF(sa.total_people, 0), 2) AS no_info_percent
FROM summary_all sa</sql>
<variables_active>Y</variables_active>
<attributes/>
@ -612,202 +497,6 @@ FROM summary_all sa</sql>
<yloc>544</yloc>
</GUI>
</transform>
<transform>
<name>Table input (person_registry) РФ/мужчины 2</name>
<type>TableInput</type>
<description/>
<distribute>Y</distribute>
<custom_distribution/>
<copies>1</copies>
<partitioning>
<method>none</method>
<schema_name/>
</partitioning>
<connection>ervu_person_registry</connection>
<execute_each_row>N</execute_each_row>
<limit>0</limit>
<sql>WITH
ids AS (
-- Преобразуем строковый массив в таблицу UUID
SELECT unnest(string_to_array(trim(both '{}' from
'${ARR_MC}'
), ','))::uuid AS recruitment_id
),
gender_separations AS (
SELECT 'MALE' AS gender
UNION ALL
SELECT 'FEMALE' AS gender
),
registered_separation AS (
SELECT 'true' AS registered
UNION ALL
SELECT 'false' AS registered
),
data_combinations AS (
-- Создаём все комбинации recruitment_id, gender и registered
SELECT
i.recruitment_id AS recruitment_id,
gs.gender,
rs.registered
FROM ids i
CROSS JOIN gender_separations gs
CROSS JOIN registered_separation rs
),
status_info AS (
SELECT
-- Проверка на обучение в вузе (есть информация и обучается)
(
CASE
WHEN jsonb_typeof(info->'svedVUZ'->'vuz') = 'array' THEN
EXISTS (
SELECT 1
FROM jsonb_array_elements(info->'svedVUZ'->'vuz') AS vuz
WHERE vuz->>'kodStatus' = '1'
)
ELSE false
END
) AS is_studying_in_vuz,
-- Проверка на обучение в колледже (есть информация и обучается)
(
CASE
WHEN jsonb_typeof(info->'svedKolledzh'->'kolledzh') = 'array' THEN
EXISTS (
SELECT 1
FROM jsonb_array_elements(info->'svedKolledzh'->'kolledzh') AS kolledzh
WHERE kolledzh->>'kodStatus' = '1'
)
ELSE false
END
) AS is_studying_in_college,
-- Проверка на работу (есть информация и работает)
(
CASE
WHEN jsonb_typeof(info->'svedTrud'->'trudDeyat') = 'array' THEN
EXISTS (
SELECT 1
FROM jsonb_array_elements(info->'svedTrud'->'trudDeyat') AS trud
WHERE trud->>'prAktMestRab' = '1'
)
ELSE false
END
) AS is_working,
-- Проверка на отсутствие сведений о вузе
info->'svedVUZ'->>'prOtsSvedVUZ' = '1' AS no_info_vuz,
-- Проверка на отсутствие сведений о колледже
info->'svedKolledzh'->>'prOtsSvedKolledzh' = '1' AS no_info_college,
-- Проверка на отсутствие сведений о работе
info->'svedTrud'->>'prOtsSvedTrud' = '1' AS no_info_work,
r.target_recruitment_id AS recruitment_id,
r.gender,
r.vu_current_info -> 'isMilitaryRegistered' AS registered--,
--r.vu_current_info->>'recruitmentCommercialInfo' AS sidit
FROM public.recruits_info ri
JOIN public.recruits r ON ri.recruit_id = r.id
WHERE (r.vu_current_info -> 'isMilitaryRegistered' = 'true' OR r.vu_current_info -> 'isMilitaryRegistered' = 'false')
AND (r.gender = 'MALE' OR r.gender = 'FEMALE')
AND r.current_recruitment_id IS NOT NULL
AND r.target_recruitment_id::uuid IN (SELECT recruitment_id FROM ids)
AND r.vu_current_info->>'recruitmentCommercialInfo' = 'true' -- осужденные
),
summary AS (
SELECT
dc.recruitment_id,
CASE
WHEN dc.gender = 'MALE' THEN 'M'
WHEN dc.gender = 'FEMALE' THEN 'W'
ELSE NULL
END AS gender,
dc.registered,
-- Количество людей, которые учатся (в вузе или колледже)
COUNT(CASE WHEN is_studying_in_vuz OR is_studying_in_college THEN 1 END) AS study,
-- Количество людей, которые работают
COUNT(CASE WHEN is_working THEN 1 END) AS work,
-- Количество людей, для которых отсутствуют сведения о вузе, колледже и работе
COUNT(CASE WHEN no_info_vuz AND no_info_college AND no_info_work THEN 1 END) AS no_info,
-- Общее количество людей
COUNT(si.recruitment_id) AS total_people
--COUNT(CASE WHEN sidit = 'true' THEN 1 END) AS convicts
FROM data_combinations dc
LEFT JOIN status_info si
ON si.recruitment_id = dc.recruitment_id
AND si.gender = dc.gender
AND si.registered::text = dc.registered
GROUP BY dc.recruitment_id, dc.gender, dc.registered
),
summary_all AS (
SELECT
recruitment_id,
registered,
'ALL' AS gender,
SUM(study) AS study,
SUM(work) AS work,
SUM(no_info) AS no_info,
SUM(total_people) AS total_people--,
--SUM(convicts) AS convicts
FROM summary
GROUP BY recruitment_id, registered
)
SELECT
current_date AS recording_date,
s.gender,
s.registered,
s.recruitment_id,
s.study,
s.work,
s.no_info,
s.total_people,
'CONVICT' AS convicts,
-- Процент людей, которые учатся
COALESCE(ROUND(s.study * 100.0 / NULLIF(s.total_people, 0), 2), 0.0) AS study_percent,
-- Процент людей, которые работают
COALESCE(ROUND(s.work * 100.0 / NULLIF(s.total_people, 0), 2), 0.0) AS work_percent,
-- Процент людей, для которых отсутствуют сведения
COALESCE(ROUND(s.no_info * 100.0 / NULLIF(s.total_people, 0), 2), 0.0) AS no_info_percent--,
--COALESCE(ROUND(s.convicts * 100.0 / NULLIF((select sum(convicts) from summary_all), 0), 2), 0.0) AS convicts_percent
FROM summary s
UNION ALL
SELECT
current_date AS recording_date,
sa.gender,
sa.registered,
sa.recruitment_id,
sa.study,
sa.work,
sa.no_info,
sa.total_people,
'CONVICT' AS convicts,
-- Процент людей, которые учатся
COALESCE(ROUND(sa.study * 100.0 / NULLIF(sa.total_people, 0), 2), 0.0) AS study_percent,
-- Процент людей, которые работают
COALESCE(ROUND(sa.work * 100.0 / NULLIF(sa.total_people, 0), 2), 0.0) AS work_percent,
-- Процент людей, для которых отсутствуют сведения
COALESCE(ROUND(sa.no_info * 100.0 / NULLIF(sa.total_people, 0), 2), 0.0) AS no_info_percent--,
--'0.0' AS convicts_percent
FROM summary_all sa</sql>
<variables_active>Y</variables_active>
<attributes/>
<GUI>
<xloc>1328</xloc>
<yloc>720</yloc>
</GUI>
</transform>
<transform_error_handling>
</transform_error_handling>
<attributes/>

View file

@ -41,26 +41,6 @@
<to>Insert / update (total_registered.education_level) 2</to>
<enabled>Y</enabled>
</hop>
<hop>
<from>Get variables 3 2 2 2</from>
<to>Select values 3 2 2 2</to>
<enabled>N</enabled>
</hop>
<hop>
<from>Select values 3 2 2 2</from>
<to>Insert / update (total_registered.education_level) 2 2</to>
<enabled>N</enabled>
</hop>
<hop>
<from>Table input (person_registry) РФ/мужчины 2</from>
<to>Get variables 3 2 2 2</to>
<enabled>N</enabled>
</hop>
<hop>
<from>Table input (person_registry) РФ/мужчины 2</from>
<to>Insert / update (total_registered.education_level) 2 2</to>
<enabled>N</enabled>
</hop>
</order>
<transform>
<name>Get variables 3 2 2</name>
@ -95,39 +75,6 @@
<yloc>624</yloc>
</GUI>
</transform>
<transform>
<name>Get variables 3 2 2 2</name>
<type>GetVariable</type>
<description/>
<distribute>Y</distribute>
<custom_distribution/>
<copies>1</copies>
<partitioning>
<method>none</method>
<schema_name/>
</partitioning>
<fields>
<field>
<length>-1</length>
<name>REC_ID</name>
<precision>-1</precision>
<trim_type>none</trim_type>
<type>String</type>
</field>
<field>
<length>-1</length>
<name>SCM</name>
<precision>-1</precision>
<trim_type>none</trim_type>
<type>String</type>
</field>
</fields>
<attributes/>
<GUI>
<xloc>1328</xloc>
<yloc>880</yloc>
</GUI>
</transform>
<transform>
<name>Insert / update (total_registered.education_level) 2</name>
<type>InsertUpdate</type>
@ -232,110 +179,6 @@
<yloc>496</yloc>
</GUI>
</transform>
<transform>
<name>Insert / update (total_registered.education_level) 2 2</name>
<type>InsertUpdate</type>
<description/>
<distribute>Y</distribute>
<custom_distribution/>
<copies>1</copies>
<partitioning>
<method>none</method>
<schema_name/>
</partitioning>
<commit>100</commit>
<connection>ervu-dashboard</connection>
<lookup>
<key>
<condition>=</condition>
<field>recruitment_id</field>
<name>recruitment_id</name>
</key>
<key>
<condition>=</condition>
<field>recording_date</field>
<name>recording_date</name>
</key>
<key>
<condition>=</condition>
<field>"all_M_W"</field>
<name>gender</name>
</key>
<key>
<condition>=</condition>
<field>convicts</field>
<name>convicts</name>
</key>
<schema>total_registered</schema>
<table>education_level</table>
<value>
<name>higher</name>
<rename>higher</rename>
<update>Y</update>
</value>
<value>
<name>average</name>
<rename>average_prof</rename>
<update>Y</update>
</value>
<value>
<name>"all_M_W"</name>
<rename>gender</rename>
<update>N</update>
</value>
<value>
<name>only_general</name>
<rename>only_general</rename>
<update>Y</update>
</value>
<value>
<name>no_data</name>
<rename>count_nodata</rename>
<update>Y</update>
</value>
<value>
<name>higher_percent</name>
<rename>higher_percentage</rename>
<update>Y</update>
</value>
<value>
<name>average_percent</name>
<rename>average_prof_percentage</rename>
<update>Y</update>
</value>
<value>
<name>only_general_percent</name>
<rename>only_general_percentage</rename>
<update>Y</update>
</value>
<value>
<name>no_data_percent</name>
<rename>count_nodata_percentage</rename>
<update>Y</update>
</value>
<value>
<name>recruitment_id</name>
<rename>recruitment_id</rename>
<update>N</update>
</value>
<value>
<name>education_level</name>
<rename>total</rename>
<update>Y</update>
</value>
<value>
<name>convicts</name>
<rename>convicts</rename>
<update>N</update>
</value>
</lookup>
<update_bypassed>Y</update_bypassed>
<attributes/>
<GUI>
<xloc>1728</xloc>
<yloc>752</yloc>
</GUI>
</transform>
<transform>
<name>Select values 3 2 2</name>
<type>SelectValues</type>
@ -390,60 +233,6 @@
<yloc>624</yloc>
</GUI>
</transform>
<transform>
<name>Select values 3 2 2 2</name>
<type>SelectValues</type>
<description/>
<distribute>Y</distribute>
<custom_distribution/>
<copies>1</copies>
<partitioning>
<method>none</method>
<schema_name/>
</partitioning>
<fields>
<select_unspecified>N</select_unspecified>
<meta>
<name>REC_ID</name>
<rename>REC_ID</rename>
<type>String</type>
<length>-2</length>
<precision>-2</precision>
<conversion_mask/>
<date_format_lenient>false</date_format_lenient>
<date_format_locale/>
<date_format_timezone/>
<lenient_string_to_number>false</lenient_string_to_number>
<encoding/>
<decimal_symbol/>
<grouping_symbol/>
<currency_symbol/>
<storage_type/>
</meta>
<meta>
<name>SCM</name>
<rename>SCM</rename>
<type>String</type>
<length>-2</length>
<precision>-2</precision>
<conversion_mask/>
<date_format_lenient>false</date_format_lenient>
<date_format_locale/>
<date_format_timezone/>
<lenient_string_to_number>false</lenient_string_to_number>
<encoding/>
<decimal_symbol/>
<grouping_symbol/>
<currency_symbol/>
<storage_type/>
</meta>
</fields>
<attributes/>
<GUI>
<xloc>1472</xloc>
<yloc>880</yloc>
</GUI>
</transform>
<transform>
<name>Table input (person_registry) РФ/мужчины</name>
<type>TableInput</type>
@ -462,11 +251,31 @@
ids AS (
SELECT unnest(string_to_array(trim(both '{}' from '${ARR_MC}'), ','))::uuid AS recruitment_id
),
last_status as (select recruit_id,
max(date_time) filter (where status not in ('1', '1.3', '12', '12.1', '12.2', '12.3', '12.4', '12.5', '13')) max_date_time
from recruits_history
where status not in ('1', '1.3', '12', '12.1', '12.2', '12.3', '12.4', '12.5', '13')
group by recruit_id
),
registered as (
select
distinct rh.recruit_id,
rh.id as recruit_history_id
from recruits_history rh
join last_status ls on rh.recruit_id=ls. recruit_id and rh.date_time=ls.max_date_time
where rh.status not in ('1', '1.3', '12', '12.1', '12.2', '12.3', '12.4', '12.5', '13')
--and rh.source is not null
),
education_status AS (
SELECT
ri.id,
r.target_recruitment_id AS recruitment_id,
ri.recruit_id AS recruit_id,
coalesce (r.current_recruitment_id, rh.current_recruitment_id) AS recruitment_id,
r.gender,
CASE
WHEN r.vu_current_info->>'recruitmentCommercialInfo' = 'true' THEN 'CONVICT'
ELSE 'ALL'
END AS convicts,
-- Высшее образование (российское или иностранное)
(
EXISTS (
@ -532,36 +341,41 @@ education_status AS (
)
) AS has_no_data
FROM public.recruits_info ri
JOIN public.recruits r ON ri.recruit_id = r.id
WHERE r.vu_current_info->>'isMilitaryRegistered' = 'true'
AND r.gender IN ('MALE','FEMALE')
AND r.current_recruitment_id IS NOT NULL
AND r.target_recruitment_id::uuid IN (SELECT recruitment_id FROM ids)
FROM public.recruits AS r
JOIN public.recruits_info AS ri ON ri.recruit_id = r.id
join public.recruits_history rh on rh.recruit_id=r.id
WHERE
r.gender IN ('MALE', 'FEMALE')
AND r.id in (SELECT recruit_id FROM registered)
AND rh.id in (SELECT recruit_history_id FROM registered)
-- AND r.vu_current_info->>'recruitmentCommercialInfo' = 'true'
AND coalesce(r.current_recruitment_id,rh.current_recruitment_id) ::uuid IN (SELECT recruitment_id FROM ids)
),
final_counts AS (
SELECT
es.gender,
es.recruitment_id,
es.convicts,
COUNT(DISTINCT es.id) AS total,
COUNT(DISTINCT CASE WHEN es.has_higher THEN es.id END) AS higher,
COUNT(DISTINCT CASE WHEN NOT es.has_higher AND es.has_average_prof THEN es.id END) AS average_prof,
COUNT(DISTINCT CASE WHEN NOT es.has_higher AND NOT es.has_average_prof AND es.has_only_general THEN es.id END) AS only_general,
COUNT(DISTINCT CASE WHEN es.has_no_data THEN es.id END) AS count_nodata
FROM education_status es
GROUP BY es.recruitment_id, es.gender
GROUP BY es.recruitment_id, es.gender, es.convicts
),
final_counts_all AS (
SELECT
'ALL' AS gender,
recruitment_id,
convicts,
SUM(total) AS total,
SUM(higher) AS higher,
SUM(average_prof) AS average_prof,
SUM(only_general) AS only_general,
SUM(count_nodata) AS count_nodata
FROM final_counts
GROUP BY recruitment_id
GROUP BY recruitment_id, convicts
)
SELECT
current_date AS recording_date,
@ -569,7 +383,7 @@ SELECT
WHEN fc.gender = 'MALE' THEN 'M'
ELSE 'W'
END AS gender,
'ALL' AS convicts,
fc.convicts,
fc.recruitment_id,
fc.higher,
fc.average_prof,
@ -585,7 +399,7 @@ UNION ALL
SELECT
current_date AS recording_date,
fca.gender,
'ALL' AS convicts,
fca.convicts,
fca.recruitment_id,
fca.higher,
fca.average_prof,
@ -604,183 +418,6 @@ FROM final_counts_all fca</sql>
<yloc>496</yloc>
</GUI>
</transform>
<transform>
<name>Table input (person_registry) РФ/мужчины 2</name>
<type>TableInput</type>
<description/>
<distribute>Y</distribute>
<custom_distribution/>
<copies>1</copies>
<partitioning>
<method>none</method>
<schema_name/>
</partitioning>
<connection>ervu_person_registry</connection>
<execute_each_row>N</execute_each_row>
<limit>0</limit>
<sql>WITH
ids AS (
SELECT unnest(string_to_array(trim(both '{}' from '${ARR_MC}'), ','))::uuid AS recruitment_id
),
gender_separations AS (
SELECT 'MALE' AS gender
UNION ALL
SELECT 'FEMALE' AS gender
),
data_combinations AS (
SELECT
i.recruitment_id AS recruitment_id,
gs.gender
FROM ids i
CROSS JOIN gender_separations gs
),
education_status AS (
SELECT
ri.id,
r.target_recruitment_id AS recruitment_id,
r.gender,
-- Высшее образование (российское или иностранное)
(
EXISTS (
SELECT 1
FROM jsonb_array_elements(ri.info->'svedRObr'->'robr') AS education
WHERE jsonb_typeof(ri.info->'svedRObr'->'robr') = 'array'
AND education->>'kodUrObr' IN ('1', '2', '3', '4', '5')
) OR EXISTS (
SELECT 1
FROM jsonb_array_elements(ri.info->'svedInObr'->'inObr') AS education
WHERE jsonb_typeof(ri.info->'svedInObr'-&gt;'inObr') = 'array'
AND education->>'kodUrObr' IN ('1', '2', '3', '4', '5')
)
) AS has_higher,
-- Среднее профессиональное образование (если нет высшего)
(
EXISTS (
SELECT 1
FROM jsonb_array_elements(ri.info->'svedRObr'->'robr') AS education
WHERE jsonb_typeof(ri.info->'svedRObr'->'robr') = 'array'
AND education->>'kodUrObr' = '10'
) OR EXISTS (
SELECT 1
FROM jsonb_array_elements(ri.info->'svedInObr'->'inObr') AS education
WHERE jsonb_typeof(ri.info->'svedInObr'->'inObr') = 'array'
AND education->>'kodUrObr' = '10'
)
) AS has_average_prof,
-- Общее образование (если нет высшего и среднего)
(
EXISTS (
SELECT 1
FROM jsonb_array_elements(ri.info->'svedRObr'->'robr') AS education
WHERE jsonb_typeof(ri.info->'svedRObr'->'robr') = 'array'
AND education->>'kodUrObr' IN ('7', '9')
) OR EXISTS (
SELECT 1
FROM jsonb_array_elements(ri.info->'svedInObr'->'inObr') AS education
WHERE jsonb_typeof(ri.info->'svedInObr'->'inObr') = 'array'
AND education->>'kodUrObr' IN ('7', '9')
)
) AS has_only_general,
-- Нет данных об образовании (российское или иностранное)
(
NOT (
(
EXISTS (
SELECT 1
FROM jsonb_array_elements(ri.info->'svedRObr'->'robr') AS education
WHERE jsonb_typeof(ri.info->'svedRObr'->'robr') = 'array'
) OR EXISTS (
SELECT 1
FROM jsonb_array_elements(ri.info->'svedInObr'->'inObr') AS education
WHERE jsonb_typeof(ri.info->'svedInObr'->'inObr') = 'array'
)
)
) AND (
ri.info->'svedRObr'->>'prOtsRObr' = '1'
OR ri.info->'svedInObr'->>'prOtsInObr' = '1'
)
) AS has_no_data
FROM public.recruits_info ri
JOIN public.recruits r ON ri.recruit_id = r.id
WHERE r.vu_current_info->>'isMilitaryRegistered' = 'true'
AND (r.gender = 'MALE' OR r.gender = 'FEMALE')
AND r.current_recruitment_id IS NOT NULL
AND r.target_recruitment_id::uuid IN (SELECT recruitment_id FROM ids)
AND r.vu_current_info->>'recruitmentCommercialInfo' = 'true' -- осужденные
),
final_counts AS (
SELECT
dc.gender,
dc.recruitment_id,
COUNT(DISTINCT es.id) AS total,
COUNT(DISTINCT CASE WHEN es.has_higher THEN es.id END) AS higher,
COUNT(DISTINCT CASE WHEN NOT es.has_higher AND es.has_average_prof THEN es.id END) AS average_prof,
COUNT(DISTINCT CASE WHEN NOT es.has_higher AND NOT es.has_average_prof AND es.has_only_general THEN es.id END) AS only_general,
COUNT(DISTINCT CASE WHEN es.has_no_data THEN es.id END) AS count_nodata
FROM data_combinations dc
LEFT JOIN education_status es
ON dc.recruitment_id = es.recruitment_id
AND dc.gender = es.gender
GROUP BY dc.recruitment_id, dc.gender
),
final_counts_all AS (
SELECT
'ALL' AS gender,
recruitment_id,
SUM(total) AS total,
SUM(higher) AS higher,
SUM(average_prof) AS average_prof,
SUM(only_general) AS only_general,
SUM(count_nodata) AS count_nodata
FROM final_counts
GROUP BY recruitment_id
)
SELECT
current_date AS recording_date,
CASE
WHEN fc.gender = 'MALE' THEN 'M'
WHEN fc.gender = 'FEMALE' THEN 'W'
ELSE NULL
END AS gender,
'CONVICT' AS convicts,
fc.recruitment_id,
fc.higher,
fc.average_prof,
fc.only_general,
fc.count_nodata,
fc.total,
COALESCE(ROUND(fc.higher * 100.0 / NULLIF(fc.total, 0), 2), 0) AS higher_percentage,
COALESCE(ROUND(fc.average_prof * 100.0 / NULLIF(fc.total, 0), 2), 0) AS average_prof_percentage,
COALESCE(ROUND(fc.only_general * 100.0 / NULLIF(fc.total, 0), 2), 0) AS only_general_percentage,
COALESCE(ROUND(fc.count_nodata * 100.0 / NULLIF(fc.total, 0), 2), 0) AS count_nodata_percentage
FROM final_counts fc
UNION ALL
SELECT
current_date AS recording_date,
fca.gender,
'CONVICT' AS convicts,
fca.recruitment_id,
fca.higher,
fca.average_prof,
fca.only_general,
fca.count_nodata,
fca.total,
COALESCE(ROUND(fca.higher * 100.0 / NULLIF(fca.total, 0), 2), 0) AS higher_percentage,
COALESCE(ROUND(fca.average_prof * 100.0 / NULLIF(fca.total, 0), 2), 0) AS average_prof_percentage,
COALESCE(ROUND(fca.only_general * 100.0 / NULLIF(fca.total, 0), 2), 0) AS only_general_percentage,
COALESCE(ROUND(fca.count_nodata * 100.0 / NULLIF(fca.total, 0), 2), 0) AS count_nodata_percentage
FROM final_counts_all fca</sql>
<variables_active>Y</variables_active>
<attributes/>
<GUI>
<xloc>1072</xloc>
<yloc>752</yloc>
</GUI>
</transform>
<transform_error_handling>
</transform_error_handling>
<attributes/>

View file

@ -41,26 +41,6 @@
<to>Insert / update (total_registered.marital_status) 2</to>
<enabled>Y</enabled>
</hop>
<hop>
<from>Get variables 3 2 2 2</from>
<to>Select values 3 2 2 2</to>
<enabled>N</enabled>
</hop>
<hop>
<from>Select values 3 2 2 2</from>
<to>Insert / update (total_registered.marital_status) 2 2</to>
<enabled>N</enabled>
</hop>
<hop>
<from>Table input (person_registry) регионы/мужчины 2</from>
<to>Get variables 3 2 2 2</to>
<enabled>N</enabled>
</hop>
<hop>
<from>Table input (person_registry) регионы/мужчины 2</from>
<to>Insert / update (total_registered.marital_status) 2 2</to>
<enabled>N</enabled>
</hop>
</order>
<transform>
<name>Get variables 3 2 2</name>
@ -95,39 +75,6 @@
<yloc>624</yloc>
</GUI>
</transform>
<transform>
<name>Get variables 3 2 2 2</name>
<type>GetVariable</type>
<description/>
<distribute>Y</distribute>
<custom_distribution/>
<copies>1</copies>
<partitioning>
<method>none</method>
<schema_name/>
</partitioning>
<fields>
<field>
<length>-1</length>
<name>REC_ID</name>
<precision>-1</precision>
<trim_type>none</trim_type>
<type>String</type>
</field>
<field>
<length>-1</length>
<name>SCM</name>
<precision>-1</precision>
<trim_type>none</trim_type>
<type>String</type>
</field>
</fields>
<attributes/>
<GUI>
<xloc>1280</xloc>
<yloc>784</yloc>
</GUI>
</transform>
<transform>
<name>Insert / update (total_registered.marital_status) 2</name>
<type>InsertUpdate</type>
@ -222,100 +169,6 @@
<yloc>544</yloc>
</GUI>
</transform>
<transform>
<name>Insert / update (total_registered.marital_status) 2 2</name>
<type>InsertUpdate</type>
<description/>
<distribute>Y</distribute>
<custom_distribution/>
<copies>1</copies>
<partitioning>
<method>none</method>
<schema_name/>
</partitioning>
<commit>100</commit>
<connection>ervu-dashboard</connection>
<lookup>
<key>
<condition>=</condition>
<field>recruitment_id</field>
<name>recruitment_id</name>
</key>
<key>
<condition>=</condition>
<field>recording_date</field>
<name>recording_date</name>
</key>
<key>
<condition>=</condition>
<field>"all_M_W"</field>
<name>gender</name>
</key>
<key>
<condition>=</condition>
<field>convicts</field>
<name>convicts</name>
</key>
<schema>total_registered</schema>
<table>marital_status</table>
<value>
<name>married</name>
<rename>married</rename>
<update>Y</update>
</value>
<value>
<name>not_married</name>
<rename>not_married</rename>
<update>Y</update>
</value>
<value>
<name>married_percent</name>
<rename>married_percent</rename>
<update>Y</update>
</value>
<value>
<name>not_married_percent</name>
<rename>not_married_percent</rename>
<update>Y</update>
</value>
<value>
<name>"all_M_W"</name>
<rename>gender</rename>
<update>N</update>
</value>
<value>
<name>recruitment_id</name>
<rename>recruitment_id</rename>
<update>N</update>
</value>
<value>
<name>marital_status</name>
<rename>total</rename>
<update>Y</update>
</value>
<value>
<name>other</name>
<rename>other</rename>
<update>Y</update>
</value>
<value>
<name>other_percent</name>
<rename>other_percent</rename>
<update>Y</update>
</value>
<value>
<name>convicts</name>
<rename>convicts</rename>
<update>N</update>
</value>
</lookup>
<update_bypassed>Y</update_bypassed>
<attributes/>
<GUI>
<xloc>1680</xloc>
<yloc>704</yloc>
</GUI>
</transform>
<transform>
<name>Select values 3 2 2</name>
<type>SelectValues</type>
@ -370,60 +223,6 @@
<yloc>624</yloc>
</GUI>
</transform>
<transform>
<name>Select values 3 2 2 2</name>
<type>SelectValues</type>
<description/>
<distribute>Y</distribute>
<custom_distribution/>
<copies>1</copies>
<partitioning>
<method>none</method>
<schema_name/>
</partitioning>
<fields>
<select_unspecified>N</select_unspecified>
<meta>
<name>REC_ID</name>
<rename>REC_ID</rename>
<type>String</type>
<length>-2</length>
<precision>-2</precision>
<conversion_mask/>
<date_format_lenient>false</date_format_lenient>
<date_format_locale/>
<date_format_timezone/>
<lenient_string_to_number>false</lenient_string_to_number>
<encoding/>
<decimal_symbol/>
<grouping_symbol/>
<currency_symbol/>
<storage_type/>
</meta>
<meta>
<name>SCM</name>
<rename>SCM</rename>
<type>String</type>
<length>-2</length>
<precision>-2</precision>
<conversion_mask/>
<date_format_lenient>false</date_format_lenient>
<date_format_locale/>
<date_format_timezone/>
<lenient_string_to_number>false</lenient_string_to_number>
<encoding/>
<decimal_symbol/>
<grouping_symbol/>
<currency_symbol/>
<storage_type/>
</meta>
</fields>
<attributes/>
<GUI>
<xloc>1424</xloc>
<yloc>784</yloc>
</GUI>
</transform>
<transform>
<name>Table input (person_registry) регионы/мужчины</name>
<type>TableInput</type>
@ -439,152 +238,68 @@
<execute_each_row>N</execute_each_row>
<limit>0</limit>
<sql>WITH
ids AS (
SELECT unnest(string_to_array(trim(both '{}' from '${ARR_MC}'), ','))::uuid AS recruitment_id
),
recruit_data AS (
SELECT
ri.info->'svedSemPolozh'->>'semPolozhNaim' AS sem_pol,
r.gender,
r.target_recruitment_id AS recruitment_id
FROM public.recruits r
LEFT JOIN public.recruits_info ri ON ri.recruit_id = r.id
WHERE r.vu_current_info->>'isMilitaryRegistered' = 'true'
AND r.gender IN ('MALE', 'FEMALE')
AND r.current_recruitment_id IS NOT NULL
AND r.target_recruitment_id::uuid IN (SELECT recruitment_id FROM ids)
),
married_counts AS (
-- Считаем значения для каждого гендера
SELECT
rd.recruitment_id,
rd.gender,
COUNT(rd.recruitment_id) FILTER (WHERE rd.sem_pol IN ('Вдова/Вдовец', 'В разводе', 'Вдовец', 'Холост')) AS not_married,
COUNT(rd.recruitment_id) FILTER (WHERE rd.sem_pol = 'В браке') AS married,
COUNT(rd.recruitment_id) FILTER (WHERE rd.sem_pol IS NULL OR rd.sem_pol = 'Отсутствуют сведения о семейном положении') AS other,
COUNT(rd.recruitment_id) AS total
FROM recruit_data rd
GROUP BY rd.recruitment_id, rd.gender
),
all_counts AS (
-- Считаем значения для ALL, суммируя данные по всем гендерам
SELECT
recruitment_id,
'ALL' AS gender,
SUM(not_married) AS not_married,
SUM(married) AS married,
SUM(other) AS other,
SUM(total) AS total
FROM married_counts
GROUP BY recruitment_id
)
-- Финальное объединение
SELECT
mc.not_married,
mc.married,
mc.total,
mc.other,
COALESCE(ROUND(mc.not_married * 100.0 / NULLIF(mc.total, 0), 2), 0) AS not_married_percent,
COALESCE(ROUND(mc.married * 100.0 / NULLIF(mc.total, 0), 2), 0) AS married_percent,
COALESCE(ROUND(mc.other * 100.0 / NULLIF(mc.total, 0), 2), 0) AS other_percent,
CASE
WHEN mc.gender = 'MALE' THEN 'M'
ELSE 'W'
END AS gender,
current_date AS recording_date,
'ALL' AS convicts,
mc.recruitment_id
FROM married_counts mc
UNION ALL
SELECT
ac.not_married,
ac.married,
ac.total,
ac.other,
COALESCE(ROUND(ac.not_married * 100.0 / NULLIF(ac.total, 0), 2), 0) AS not_married_percent,
COALESCE(ROUND(ac.married * 100.0 / NULLIF(ac.total, 0), 2), 0) AS married_percent,
COALESCE(ROUND(ac.other * 100.0 / NULLIF(ac.total, 0), 2), 0) AS other_percent,
ac.gender,
current_date AS recording_date,
'ALL' AS convicts,
ac.recruitment_id
FROM all_counts ac</sql>
<variables_active>Y</variables_active>
<attributes/>
<GUI>
<xloc>1040</xloc>
<yloc>544</yloc>
</GUI>
</transform>
<transform>
<name>Table input (person_registry) регионы/мужчины 2</name>
<type>TableInput</type>
<description/>
<distribute>Y</distribute>
<custom_distribution/>
<copies>1</copies>
<partitioning>
<method>none</method>
<schema_name/>
</partitioning>
<connection>ervu_person_registry</connection>
<execute_each_row>N</execute_each_row>
<limit>0</limit>
<sql>WITH
ids AS (
SELECT unnest(string_to_array(trim(both '{}' from '${ARR_MC}'), ','))::uuid AS recruitment_id
),
gender_separations AS (
SELECT 'MALE' AS gender
UNION ALL
SELECT 'FEMALE' AS gender
last_status as (select recruit_id,
max(date_time) filter (where status not in ('1', '1.3', '12', '12.1', '12.2', '12.3', '12.4', '12.5', '13')) max_date_time
from recruits_history
where status not in ('1', '1.3', '12', '12.1', '12.2', '12.3', '12.4', '12.5', '13')
group by recruit_id
),
data_combinations AS (
SELECT
i.recruitment_id AS recruitment_id,
gs.gender
FROM ids i
CROSS JOIN gender_separations gs
registered as (
select
distinct rh.recruit_id,
rh.id as recruit_history_id
from recruits_history rh
join last_status ls on rh.recruit_id=ls. recruit_id and rh.date_time=ls.max_date_time
where rh.status not in ('1', '1.3', '12', '12.1', '12.2', '12.3', '12.4', '12.5', '13')
--and rh.source is not null
),
recruit_data AS (
SELECT
ri.info->'svedSemPolozh'->>'semPolozhNaim' AS sem_pol,
r.gender,
r.target_recruitment_id AS recruitment_id
FROM public.recruits r
LEFT JOIN public.recruits_info ri ON ri.recruit_id = r.id
WHERE r.vu_current_info->>'isMilitaryRegistered' = 'true'
AND r.gender IN ('MALE', 'FEMALE')
AND r.current_recruitment_id IS NOT NULL
AND r.vu_current_info->>'recruitmentCommercialInfo' = 'true'
AND r.target_recruitment_id::uuid IN (SELECT recruitment_id FROM ids)
CASE
WHEN r.vu_current_info->>'recruitmentCommercialInfo' = 'true' THEN 'CONVICT'
ELSE 'ALL'
END AS convicts,
coalesce (r.current_recruitment_id, rh.current_recruitment_id) AS recruitment_id
FROM public.recruits AS r
JOIN public.recruits_info AS ri ON ri.recruit_id = r.id
JOIN public.recruits_history rh on rh.recruit_id=r.id
WHERE
r.gender IN ('MALE', 'FEMALE')
AND r.id in (SELECT recruit_id FROM registered)
and rh.id in (SELECT recruit_history_id FROM registered)
--and r.vu_current_info->>'recruitmentCommercialInfo' = 'true'
and coalesce(r.current_recruitment_id,rh.current_recruitment_id) ::uuid IN (SELECT recruitment_id FROM ids)
),
married_counts AS (
-- Считаем значения для каждого гендера
SELECT
dc.recruitment_id,
dc.gender,
rd.recruitment_id,
rd.gender,
rd.convicts,
COUNT(rd.recruitment_id) FILTER (WHERE rd.sem_pol IN ('Вдова/Вдовец', 'В разводе', 'Вдовец', 'Холост')) AS not_married,
COUNT(rd.recruitment_id) FILTER (WHERE rd.sem_pol = 'В браке') AS married,
COUNT(rd.recruitment_id) FILTER (WHERE rd.sem_pol IS NULL OR rd.sem_pol = 'Отсутствуют сведения о семейном положении') AS other,
COUNT(rd.recruitment_id) AS total
FROM data_combinations dc
LEFT JOIN recruit_data rd
ON rd.recruitment_id = dc.recruitment_id
AND rd.gender = dc.gender
GROUP BY dc.recruitment_id, dc.gender
FROM recruit_data rd
GROUP BY rd.recruitment_id, rd.gender, rd.convicts
),
all_counts AS (
-- Считаем значения для ALL, суммируя данные по всем гендерам
SELECT
recruitment_id,
'ALL' AS gender,
convicts,
SUM(not_married) AS not_married,
SUM(married) AS married,
SUM(other) AS other,
SUM(total) AS total
FROM married_counts
GROUP BY recruitment_id
GROUP BY recruitment_id, convicts
)
-- Финальное объединение
SELECT
@ -592,16 +307,15 @@ SELECT
mc.married,
mc.total,
mc.other,
mc.convicts,
COALESCE(ROUND(mc.not_married * 100.0 / NULLIF(mc.total, 0), 2), 0) AS not_married_percent,
COALESCE(ROUND(mc.married * 100.0 / NULLIF(mc.total, 0), 2), 0) AS married_percent,
COALESCE(ROUND(mc.other * 100.0 / NULLIF(mc.total, 0), 2), 0) AS other_percent,
CASE
WHEN mc.gender = 'MALE' THEN 'M'
WHEN mc.gender = 'FEMALE' THEN 'W'
ELSE NULL
WHEN mc.gender = 'MALE' THEN 'M'
ELSE 'W'
END AS gender,
current_date AS recording_date,
'CONVICT' AS convicts,
mc.recruitment_id
FROM married_counts mc
UNION ALL
@ -610,19 +324,19 @@ SELECT
ac.married,
ac.total,
ac.other,
ac.convicts,
COALESCE(ROUND(ac.not_married * 100.0 / NULLIF(ac.total, 0), 2), 0) AS not_married_percent,
COALESCE(ROUND(ac.married * 100.0 / NULLIF(ac.total, 0), 2), 0) AS married_percent,
COALESCE(ROUND(ac.other * 100.0 / NULLIF(ac.total, 0), 2), 0) AS other_percent,
ac.gender,
current_date AS recording_date,
'CONVICT' AS convicts,
ac.recruitment_id
FROM all_counts ac;</sql>
<variables_active>Y</variables_active>
<attributes/>
<GUI>
<xloc>1040</xloc>
<yloc>704</yloc>
<yloc>544</yloc>
</GUI>
</transform>
<transform_error_handling>