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 で行った中で最大のプルです。

どんな助けでも大いに助けになるでしょう。

4

3 に答える 3

1

ここで、一度に 1 つの内部結合にコメントし、以下のクエリを実行して、これらの結合のどれが 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

すべてのテーブルに対して上記のクエリを繰り返します。これにより、料金テーブルと他のテーブルの間の関係がどのようなものかがわかります。もちろん、cpt4_code_mstr テーブルには cpt4_code_id を使用しますが、名前から見ると、このテーブルはマスター テーブルのように見えるため、料金テーブルの cpt4-code_id 値ごとにサイン値があります。

それが役立つことを願っています

于 2012-07-26T20:05:51.903 に答える
1

データ構造と外部キーの関係について詳しく知らなければ、この答えは知識に基づいた憶測にすぎません。ただし、答える前に、適切な JOIN 構文を学ぶ必要があります。クエリは次のようになります。

 from charges c join
      person p
      on . . . .

そうは言っても、あなたの問題はおそらく、同時に複数の次元に沿って参加していることです. はっきりとはわかりませんが、私は、ある人が A、B、C のように複数の患者と遭遇する可能性があると推測しています。また、10、11、12 のように複数の請求がある可能性もあります。

この場合、クエリは組み合わせごとに 1 行ずつ、合計 9 行を生成します。

つまり、次のことを特定する必要があります。

  1. テーブル間の結合キーを確認します。transaction というテーブルは本当に person_id を使用してエンカウンターとコストに結合されていますか?
  2. 外積を取得している場所を見つけて、2 つのサブクエリに分割し、それらを適切に結合します。

最初の 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

次に、一度に 1 つのテーブルでクエリを作成して、必要な結果を取得します。

最後に、テーブル エイリアスを使用する場合、テーブルを呼び出すエイリアスを使用する方がはるかに明確であることがわかります。充電の「C」はとても良いです。Patient_encounters の「pe」などを検討してください。

于 2012-07-26T19:48:24.640 に答える
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
于 2012-07-26T19:48:50.827 に答える