2012-07-26 26 views
1

問題這是我的腳本:與聯合許多表讓許多價值

select c.rendering_id as prov_number, c.begin_date_of_service as date_of_service, 
    c.practice_id as group_number, v.enc_nbr as invoice, p.person_nbr as patient, 
    v.enc_nbr as invoice_number, c.charge_id as transaction_number, 
    t.med_rec_nbr as primary_mrn, p.last_name, p.first_name, 
    z.payer_id as orig_fsc_number, z.payer_id as curr_fsc_number, 
    c.location_id as location_number, c.closing_date as posting_date, 
    c.quantity as service_units, c.amt as charge_amount, 
    c.cpt4_code_id as procedure_code, r.description as procedure_name, 
    x.tran_code_id as pay_code_number, ISNULL([modifier_1],'') as modifier_code_1, 
    ISNULL([modifier_2],'') as modifier_code_2, ISNULL([modifier_3],'') as modifier_code_3, 
    ISNULL ([icd9cm_code_id],'') as dx_code_1, ISNULL ([icd9cm_code_id_2],'') as dx_code_2, 
    ISNULL ([icd9cm_code_id_3],'') as dx_code_3, ISNULL ([icd9cm_code_id_4],'') as dx_code_4 

from charges c, person p, patient t, patient_encounter v, encounter_payer z, cpt4_code_mstr r, transactions x 

where c.person_id = p.person_id 
    and c.person_id = t.person_id 
    and c.person_id = v.person_id 
    and c.person_id = z.person_id 
    and c.cpt4_code_id = r.cpt4_code_id 
    and c.person_id = x.person_id 
    and c.practice_id = '0001' 
    and c.closing_date >= GetDate() - 7 

我應該得到大約14K行,但這個我得到一對夫婦十萬。我覺得應該有一個內部連接來糾正它,但我已閱讀了一堆帖子,似乎可以得到它的工作。它是迄今爲止我在SQL中做過的最大的一次拉。

任何幫助將大大幫助。

+0

其實,你已經在上面的查詢中使用了內連接。 – biziclop 2012-07-26 19:39:07

+1

左連接只能給他*更多*結果行。 – wildplasser 2012-07-26 19:39:53

+1

您需要確定哪些表具有多對一的關係並添加更多條件來過濾數據。 – ShaneBlake 2012-07-26 19:41:24

回答

1

不知道更多關於數據結構和外鍵關係,這個答案只是教育炒作。但在回答之前,您需要學習正確的JOIN語法。您的查詢應該如下所示:

from charges c join 
     person p 
     on . . . . 

也就是說,您的問題可能是您在同一時間沿多個維度加入。儘管沒有明確說明,但我猜測一個人可能有多個患者遇到,例如A,B和C.一個人也可能有多個費用,比如說10,11和12.

您的查詢會產生九個在這種情況下行,每個組合一個。

換句話說,你需要確定:

  1. 確認表之間的連接鍵。被稱爲交易的表是否真正加入了使用person_id的遭遇和成本?
  2. 找出你在哪裏得到交叉產品,並將其拆分成兩個子查詢,然後將它們恰當地結合在一起。

我建議你開始與前兩個表,看看你是否得到預期的行數:

select * 
from charges c join 
    person p 
    on c.person_id = p.person_id 
where c.practice_id = '0001' and 
    c.closing_date >= GetDate() - 7 

然後同時建立查詢一個表得到的結果你要。

最後一個注意事項是,當使用表別名時,我發現使用喚醒表的別名更清晰。 「C」收費非常好。考慮一下像patient_encounters的「pe」等等。

+0

是的,我也嘗試了前兩個表的路徑,並與內工作得很好加入了弗里斯特兩人隨後,當我加入表patient_encounter v是當我得到了許多行。 patient_encounter包含person_id,但我得到380k行。我知道7天內有不止一位患者,但有什麼方法可以清除結果?對不起,如果我沒有正確解釋,因爲你最有可能告訴SQL不是我最好的主題。 – user1555811 2012-07-26 19:58:07

+0

如果您想加入person id,那麼您需要在患者指定的子查詢上查找子查詢中的人員id。換句話說,您需要弄清楚如何在人員ID級別對數據進行分組,以避免重複。 – 2012-07-26 20:00:25

+0

如果你有一對多的關係,並且你使用了一個連接,你將得到多個返回的記錄。這是正常的和預期的連接行爲。如果你只需要每人一條記錄,那麼你必須做一些事情來告訴它你想要的許多記錄中的哪一個,或者你必須使用某種函數或forXML路徑在你想要的列中輸入一個以逗號分隔的列表表。你現在的問題是你不知道你想要什麼記錄。一旦你告訴使用,我們可以幫助你。 – HLGEM 2012-07-26 20:06:33

1

它應該是這樣的,或者您可以使用左連接

select c.rendering_id as prov_number, c.begin_date_of_service as date_of_service, 
c.practice_id as group_number, v.enc_nbr as invoice, p.person_nbr as patient, 
v.enc_nbr as invoice_number, c.charge_id as transaction_number, 
t.med_rec_nbr as primary_mrn, p.last_name, p.first_name, 
z.payer_id as orig_fsc_number, z.payer_id as curr_fsc_number, 
c.location_id as location_number, c.closing_date as posting_date, 
c.quantity as service_units, c.amt as charge_amount, 
c.cpt4_code_id as procedure_code, r.description as procedure_name, 
x.tran_code_id as pay_code_number, ISNULL([modifier_1],'') as modifier_code_1, 
ISNULL([modifier_2],'') as modifier_code_2, ISNULL([modifier_3],'') as modifier_code_3, 
ISNULL ([icd9cm_code_id],'') as dx_code_1, ISNULL ([icd9cm_code_id_2],'') as dx_code_2, 
ISNULL ([icd9cm_code_id_3],'') as dx_code_3, ISNULL ([icd9cm_code_id_4],'') as dx_code_4 

from charges c 
inner join person p on c.person_id = p.person_id 
inner join patient t on c.person_id = t.person_id 
inner join patient_encounter v on c.person_id = v.person_id 
inner join encounter_payer z on c.person_id = z.person_id 
inner join cpt4_code_mstr r on c.cpt4_code_id = r.cpt4_code_id 
inner join transactions x on c.person_id = x.person_id 

where c.practice_id = '0001' 
and c.closing_date >= GetDate() - 7 
1

現在,你對此有何評論一個內部聯接的時間和執行下面的查詢,看看其中哪些連接是造成一對多的關係...當計數給出14 K附近時,這意味着註釋表導致了1對多關係。

否則最好的方法是根據這些表上的唯一鍵,主鍵和FK找到關係​​。

select 
count(c.person_id) 
from charges c 
inner join person p on c.person_id = p.person_id 
inner join patient t on c.person_id = t.person_id 
inner join patient_encounter v on c.person_id = v.person_id 
inner join encounter_payer z on c.person_id = z.person_id 
inner join cpt4_code_mstr r on c.cpt4_code_id = r.cpt4_code_id 
inner join transactions x on c.person_id = x.person_id 

where c.practice_id = '0001' 
and c.closing_date >= GetDate() - 7 

您可以嘗試

select count(*) from <tablename> group by person_id having count(*) > 1 

,並重覆上述查詢所有表這會給你什麼樣的收費表和其他表之間關係的想法。 Offcourse對cpt4_code_mstr表使用cpt4_code_id,但通過名稱,它看起來像是這張表是主表,所以它對於收費表中的每個cpt4-code_id值將具有一個標號值。

我希望它能幫到

+0

好了,所以我做了,發現我的麻煩製造者內加入patient_encounter v中c.person_id = v.person_id內對c.person_id = z.person_id內部聯接encounter_payer上的z c.person_id加入交易X = x.person_id – user1555811 2012-07-26 20:29:13

+0

,所以我必須弄清楚如何將他們縮小到應該從收費表中顯示的14k條記錄。嗯所以使用除person_id之外的其他東西作爲鏈接可以幫助?我查了一下patient_encounter表,其中有幾列與location_id這樣的費用相同,但這又會超過1比1和practice_id,但同樣的問題。 – user1555811 2012-07-26 20:31:51

+0

,你需要找到這兩個tables.Maybe談話之間存在什麼樣的關係誰知道這些表更好還是看一些其他的查詢在這兩個tables.These之間數據庫的人必須給你的想法添加額外condition.I希望我會幫你的。 – 2012-07-26 20:36:52