Tôi hy vọng hiểu truy vấn cấu trúc và bảng của bạn và truy vấn bên dưới sẽ giúp bạn.
Bạn có thể xem bảng cấu trúc và kết quả truy vấn của tôi: dbfiddle
Không có tổng hợp:
with allow_category as (select unnest(array [
'cpt',
'drg',
'modifiers',
'secondaryDiagnosis',
'principalDiagnosis',
'secondaryProcedure',
'observationhours',
'dischargeStatus',
'principalprocedure',
'hcpcs',
'professionalEvaluationManagement'
]::text[]) category)
select distinct ctextid,
vbillid,
initcap(kcy.key) as typeofcorrection,
initcap(regexp_replace(kc.key, '([a-z])([A-Z])', '\1 \2', 'g')) as errorpara,
case when f ? 'from' then f -> 'from' ->> 'code' else '' end as oldvalue,
case when f ? 'to' then f -> 'to' ->> 'code' else f ->> 'code' end as newvalue
from qareport q
cross join jsonb_each(q.codemap) as kc
cross join jsonb_each(kc.value) as kcy
join jsonb_array_elements(kcy.value) f on true
where kc.key in (select * from allow_category)
and kcy.key in ('added', 'revised', 'removed')
and (
jsonb_array_length(kc.value -> 'added') > 0
or jsonb_array_length(kc.value -> 'revised') > 0
or jsonb_array_length(kc.value -> 'removed') > 0
);
Với tổng hợp:
with allow_category as (select unnest(array [
'cpt',
'drg',
'modifiers',
'secondaryDiagnosis',
'principalDiagnosis',
'secondaryProcedure',
'observationhours',
'dischargeStatus',
'principalprocedure',
'hcpcs',
'professionalEvaluationManagement'
]::text[]) category)
select distinct ctextid,
vbillid,
initcap(kcy.key) as typeofcorrection,
initcap(regexp_replace(kc.key, '([a-z])([A-Z])', '\1 \2', 'g')) as errorpara,
case when f ? 'from' then f -> 'from' ->> 'code' else '' end as oldvalue,
case
when f ? 'to' then f -> 'to' ->> 'code'
else string_agg(f ->> 'code', ',')
over (partition by ctextid, vbillid, kcy.key, kc.key) end as newvalue
from qareport q
cross join jsonb_each(q.codemap) as kc
cross join jsonb_each(kc.value) as kcy
join jsonb_array_elements(kcy.value) f on true
where kc.key in (select * from allow_category)
and kcy.key in ('added', 'revised', 'removed')
and (
jsonb_array_length(kc.value -> 'added') > 0
or jsonb_array_length(kc.value -> 'revised') > 0
or jsonb_array_length(kc.value -> 'removed') > 0
);