楊業春
隨著大數據時代的到來,結構型數據庫成為醫院信息儲存的主要工具。衛生行政部門的監督指導愈加重視衛生統計數據的及時性和準確性,這在諸如三甲醫院評審、高水平醫院遴選、醫改付費制度改革等工作中均可見一斑。衛生統計參與到衛生管理和行政決策,這對醫院統計工作者提出了新的要求,及時、準確地提供管理部門所需的定期統計監測數據,同時開展數據挖掘輔助決策,成為新時代醫院統計工作的機遇和挑戰[1]。
廣東省采用統一的病案首頁,衛生管理部門對醫療機構評價時關注的統計指標大量涉及病案首頁;定期監測意味著需要按月/季/年等形式重復統計。一般要基于病案首頁數據進行分析統計,常規的做法是將原始記錄導入到統計軟件中進行;但隨著首頁信息量和病例樣本量的遞增,導出數據的過程非常耗時耗力,重復統計的過程更是低效繁瑣。SQL(structured query language,SQL)即結構化查詢語言,是用于關系型數據通訊的標準語言[2]。在廣東省統一的病案統計管理系統中的“查詢分析器”模塊,能直接編寫并保存SQL模塊進行統計分析,結果直觀地展示在查詢分析器窗口,統計工作效率大幅度提高。同時,由于SQL的靈活性,可以根據不同的關注點和調研目的隨時編寫語句,展示特定條件下的原始記錄,因此為醫院統計工作中的數據審核及數據完善工作提供了一種快捷、靈活的工具。
SQL語言是用于關系型數據庫的通訊工具,因此熟悉數據庫及其之間的關系是應用SQL的前提。以廣東省病案統計管理系統為例[3],常用的數據庫主要有主信息表tpatientvisit,診斷表tdiagnose和手術表toperation:主信息表儲存患者的基本信息,如性別、年齡等;診斷表儲存患者的疾病診斷信息,包括疾病名稱和國際疾病分類(international classification of diseases,ICD)等;手術表儲存患者的手術信息,包括手術名稱和手術碼(ICD-9-CM-3)等。3個數據庫是通過病案號(fprn)和住院次數(ftimes)產生關聯。在醫院統計工作中運用SQL,除了要掌握SQL語句及其函數的用途和適用條件,還要理解數據統計口徑、源數據字段、源字段代碼的含義等,才能獲得準確的統計數據結果,提高統計工作效率。
以《三甲綜合醫院評審》中的18種住院重點病種中“急性心肌梗死”病種2017年的統計監測數據為例[4]。統計口徑:按每季度、每年監測年齡≥18歲的急性心肌梗死(主要診斷ICD為I21-I22)住院患者的總例數、死亡例數、平均住院日與平均住院費用。SQL語句如下:
select count(a.fprn) 例數,
sum(case when a.flyfsbh=‘5’ then 1 else 0 end) 死亡例數,
cast(avg(cast(a.fdays as float)) as decimal(20,2)) 平均住院日,
cast(avg(cast(fsum1 as float)) as decimal(20,2)) 平均住院費用
from tpatientvisit a left join tdiagnose b on a.fprn = b.fprn and a.ftimes=b.ftimes
where a.fcydate>=‘20170101’ and a.fcydate<‘20180101’
and left(a.fage,1)=‘Y’ and (cast(substring(a.fage,2,3) as float))>=‘18’
and (b.ficdm like ‘I21%’ or b.ficdm like ‘I22%’ ) and b.fzdlx=‘1’
由于18個住院病種的ICD碼要求各不相同,ICD的值域范圍各有特點,因此對應的SQL查詢統計各異,將其歸納為表1所示的6大類。

表1 18種住院重點病種的疾病ICD碼歸類及SQL條件設置語句
以《三甲綜合醫院評審》中的18種住院重點手術中“陰道分娩術”2017年的統計監測數據為例[4]。統計口徑:按每季度、每年監測年齡≥18歲的“陰道分娩”手術出院患者的總例數、死亡例數、平均住院日與平均住院費用。“陰道分娩”病例定義為ICD-9-CM-3:72;73.0-73.2;73.4-73.9同時伴ICD為Z37。SQL語句如下:
select count(d.fprn) 例數,
sum(case when d.flyfsbh in (‘5’) then 1 else 0 end) 死亡例數,
cast(avg(cast(d.fdays as float)) as decimal(20,2)) 平均住院日,
cast(avg(cast(d.fsum1 as float)) as decimal(20,2)) 平均住院費用
from (select distinct a.fprn,a.ftimes,a.flyfsbh,
a.fdays,a.fsum1
from tpatientvisit a,toperation b,tdiagnose c
where a.fprn = b.fprn and a.ftimes=b. ftimes and a.fprn = c.fprn and a.ftimes=c.ftimes
and a.fcydate>=‘20170101’ and a.fcydate<‘20180101’
and left(a.fage,1)=‘Y’ and(cast(substring(a.fage,2,3) as float))>=‘18’
and ((substring(b.fopcode,1,4) in (‘73.0’,‘73.1’,‘73.2’,‘73.4’,‘73.5’,‘73.6’,‘73.7’,‘73.8’,‘73.9’))
or (b.fopcode like ‘72%’)) and substring(c.ficdm,1,3)=‘Z37’)as d
本例同時涉及病種和手術,新建數據子集d,它將符合時間段內(2017年),年齡≥18歲相應診斷和手術的病例篩選出來。“distinct”將同一次住院的多條手術記錄剔除,僅保留一條用于統計指標的計算。該實例通過病案號和次數關聯了3個數據庫,包括主信息庫、診斷庫和手術庫,分別用a、b和c代替它們。如表2所示,歸納了18種住院重點手術的SQL主要語句的差異。

表2 18種住院重點手術的ICD-9-CM-3碼歸類及SQL條件語句差異
以ICD碼前3位作為病種歸類的統計口徑,可以運用SQL語句產生住院疾病譜:
select substring(b.ficdm,1,3) 疾病編碼,
count(b.fprn) 病例數
from tpatientvisit a left join tdiagnose b on a.fprn = b.fprn and a.ftimes=b. ftimes
where a.fcydate>=‘20170101’ and a.fcydate<‘20180101’ and b.fzdlx=‘1’
group by substring(b.ficdm,1,3)
order by count(b.fprn) desc
同樣原理,可以運用SQL語句產生住院手術譜,只需要將診斷庫中ICD碼的設置為手術庫中相應的手術碼即可。
隨著計算機互聯網滲透到醫療行業的方方面面,基于大數據的精細化管理成為現代化衛生事業管理的基本需求,統計監測和統計輔助決策在醫院內部管理和衛生行政部門的監督過程中扮演越來越重要的角色。衛生統計監測已經在衛生行政部門的監管行為和醫院內部的定期績效考核評價中逐步實現。不管是上級部門的監管指標還是醫院內部的管理考核需求,統計數據指標一段時期內相對固定。一般傳統的統計方式是在病案統計管理系統中查詢原始的數據記錄,通過Excel的形式導出數據,而后通過其他的統計軟件對導出的數據進行分析操作。這種方法的一個顯著缺陷是原始記錄的導出時間較長,同時導出過程中可能造成數據格式等錯誤;另一方面,相對固定的統計監測指標在每月/季/年均需要重復導出和重復統計操作,耗時耗力。SQL在病案統計管理軟件中直接編寫和運行結果,省略了數據導出過程,避免了原始數據傳送過程中的錯誤;同時形成的SQL語句查詢統計模板,只須稍作修改(如日期和科室等)即可直接輸出所需的統計監測指標,減少了重復性的統計操作,大大提高了統計工作效率[5-6]。其次,SQL語句的編寫靈活性高,數據提取速度快,能根據分析目的隨時展示不同的統計結果,因此非常適合在日常醫院統計工作中使用,能隨時根據醫院管理的需求提供統計數據的參考,輔助決策。
由于SQL在數據庫中直接運用,能直接顯示原始數據的基本情況,因此對于快速發現原始數據中的漏項、邏輯錯誤,查詢某些符合特殊條件的記錄等是非常有效的一種工具。因此對于病案首頁數據質量的核查、數據審核和數據清理等,能發揮一定的作用。
SQL又稱為結構化查詢語言,它的主要功能在于查詢符合條件的數據庫記錄。醫院統計工作者借助該語言進行統計時,是采用了其基本的函數及條件設置語句,當統計指標較為簡單諸如例數、平均數時,SQL能完全滿足使用要求;但由于SQL自身的局限性,對于較為復雜的統計指標或者涉及統計模型、統計方程時,SQL無能為力,仍需借助專業的統計軟件和程序。因此,SQL更適用于統計監測、數據核查和清理及初步的數據挖掘。
SQL中的語法雖然簡單易學,但必須熟練掌握每個語句和函數的適用條件和特點,才能正確運用,保障數據的準確性[7-8]。如實例1中“between…and…”語句,其特點是“邊界包含”,如2017年間應寫為“fcydate between ‘20170101’ and ‘20171231’”;而直接用不等符號設置條件時,應寫為“fcydate>=‘20170101’ and fcydate<‘20180101’”。又如平均數函數Avg,它的適用條件前提是數值型數據,但病案首頁數據庫中,“天數(fdays)”是字符型數據,因此首先用cast函數將其轉換為數值型數據方能進行計算。
同時,統計人員還必須根據源字段的值域范圍及語句適用前提甄別采用的SQL語句是否恰當。如實例1中第4類和第5類病種查詢的SQL語句,雖然都是查詢ICD碼范圍,但第5類查詢采用了“substring”語句而第6類查詢采用了“between…and…”語句。這是由于ICD碼值域的復雜性決定的:ICD碼J12-J16的范圍內不僅包含數字[9-10],還包含字母(J13.x00,J14.x00),若使用“between…and…”語句,則包含字母的記錄不能被識別并篩選出來,從而造成統計數據的錯誤;而K25-K28中的ICD碼僅包含數字形式,因此可以直接采用“between…and…”進行篩選統計。
在住院病種和手術監測指標的統計過程中,對統計口徑的理解是前提和基礎。不同的統計口徑,決定了不同的SQL語句模塊。如對住院18種重點手術的統計中,同一個病例同一次住院,有2個以上的手術碼符合某一特定手術的條件,僅統計為一例,因此SQL語句中需要加上“distinct”以刪除重復記錄;又如ICD碼和ICD-9-CM-3手術碼的截取位數(類目?第一位亞目?)要根據研究目的確定,截取的位數不同對病種排序結果影響顯著,有時甚至出現相反的結果。