2016-02-25 77 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進行使用 –