我在肯尼亚基苏木的一家医院有一个openmrs版本1.9.7的本地实施。由于OpenMrs数据库的复杂性,当我尝试编写查询以访问从数据库收集的患者数据以进行数据管理时出现问题。因为我已经离开练习了一段时间,但是我对sql也有点尘土飞扬,但我需要尽快提供数据。 我目前的查询如下:
SELECT p.date_created as date_enrolled, pi.identifier, pi.identifier_type identifier_type ,
pn.given_name,pn.middle_name, pn.family_name, p.person_id, p.gender, p.birthdate, p.death_date,
ob.obs_datetime, cm.name as obs_type, CASE co.datatype_id when '1' then ob.value_numeric
when '2' then (select name from concept_name where concept_id = ob.value_coded limit 1)
when '3' then ob.value_text when '6' then ob.value_datetime when '10' then ob.value_boolean when '13' then ob.value_complex else "N/A" END AS obs_value, e.encounter_datetime
FROM person p JOIN person_name pn ON p.person_id = pn.person_id
JOIN patient_identifier pi ON p.person_id = pi.patient_id
JOIN patient_identifier_type pit ON pit.patient_identifier_type_id = pi.identifier_type
JOIN obs ob ON p.person_id = ob.person_id JOIN encounter e ON e.encounter_id = ob.encounter_id
JOIN concept_name cm ON ob.concept_id = cm.concept_id
JOIN concept co ON ob.concept_id = co.concept_id
JOIN concept_datatype cdt ON cdt.concept_datatype_id = co.datatype_id;
是否使用了已经存在的查询,我可以将其用作启动器并根据我的需要进行修改? 或者更确切地说,你建议我如何最好地通过这个?
由于
答案 0 :(得分:1)
考虑到所有涉及的表,你做得很好。这是非常复杂的SQL,因为您将标题和详细信息数据混合在一行中。如果你想在一个查询中写一些东西,你有2个相当大的问题:1)当我怀疑你只想要一个时,concept_name有多个语言环境(语言)。尝试像locale =' en'减少行数。 2)obs表是EAV(entity-attribute-value),正如您所发现的,不同的值字段对应于不同的数据类型。要解决这个问题,请查看MySql的GROUP_CONCAT函数。这是一个粗略的查询,虽然我删除了一些简化的东西,只是让它工作。它会让你知道如何使用GROUP_CONCAT,但我对数据类型 - >值CASE声明:
SELECT p.date_created as date_enrolled,
pi.identifier, pi.identifier_type, pn.given_name,
left(GROUP_CONCAT(ob.obs_datetime, cm.name SEPARATOR '\t'),60) as 'ItemDate|ItemName',
e.encounter_datetime
FROM person p JOIN person_name pn ON p.person_id = pn.person_id
JOIN patient_identifier pi ON p.person_id = pi.patient_id
JOIN patient_identifier_type pit ON pit.patient_identifier_type_id = pi.identifier_type
JOIN obs ob ON p.person_id = ob.person_id
JOIN encounter e ON e.encounter_id = ob.encounter_id
JOIN concept_name cm ON ob.concept_id = cm.concept_id
JOIN concept co ON ob.concept_id = co.concept_id
JOIN concept_datatype cdt ON cdt.concept_datatype_id = co.datatype_id
where cm.locale = 'en'
group by 2 limit 10;
所有这一切,我都不认为OpenMRS人会建议你继续尝试这个。请改用他们的报告工具。