2016-02-25 85 views
0

我在肯尼亚基苏木的一家医院中实施了openmrs 1.9.7版的本地实现。由于OpenMrs数据库的复杂性,当我尝试编写查询来访问从数据库收集的患者数据以进行数据管理时,会出现问题。自从我练习了一段时间后,我对sql也有点灰尘,但我很快就需要数据。 我有目前查询是如下示例OpenMRS MySQL查询从数据库中读取数据

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; 

有没有用,我可以作为首发使用,并可能修改,以适合我的需要已经存在的查询? 或者更确切地说,你对我的建议是否最好通过这个?

谢谢

回答

1

考虑到涉及的所有表格,你做得相当好。这是非常复杂的SQL,因为您在单行中混合标题和细节数据。如果您想在单个查询中编写某些内容,那么您在这里有两个相当大的问题: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人会建议你不断地尝试这个。改用他们的报告工具。

+0

其实我错过了内部化的部分,所以我从obs表中获得了很多行数据,所以非常感谢。关于使用openmrs报告模块,我已经在使用它了,但是我不得不从模块中使用我自己的查询,因为我期望的聚合涉及的远远超过了报告模块提供的操作。这些查询在报告模块中通过@rengaw进行使用 –