2016-06-30 14 views
0

基本的に私は患者ID、ケアプロバイダーID、時間、kcode、日付、および空の列を含むストアードプロシージャーのテーブルを持っています医師が正しいkcodeを入手したかどうか。医者は、患者が最も多く見られた場合、患者のためにkcodeを取得します。その医者と他の医者が同じ時間量を見た場合、それは最も早い時期に選択することに頼っている。テーブル内の他の条件に基づいてレコードを照会します(レコードの選択)

各患者のkcodeを取得した医師の横に1を挿入するクエリを書くにはどうすればよいですか?以下は、私がストアドプロシージャからテーブルを照会するときに得られる結果の写真です。私は、クエリを使用する場合

これが結果です:法案テーブルの

SELECT DISTINCT allCodes.PTNT_ID, allCodes.CP_ID FROM tmp_kcodes allCodes 
JOIN BILL b ON b.PTNT_ID = allCodes.PTNT_ID 
WHERE b.STS_CD = 'P' 
ORDER BY PTNT_ID; 

「P」はちょうど支払った法案を探しています。

enter image description here

答えて

0

これは少し面倒ですが、sprocから選択したテーブルにいくつかの派生テーブルを書き込むと、2つの不一致基準を特定できるはずです:1)見た時間は、kcode 2を取得しなかったcp )時間は等しいと最も早い日付は<割り当てられたcpの最も早い日付です。

select 
    ptnt_id 
    --Assigned CP values 
    , assigned_cp 
    , assigned_times_seen 
    , assigned_got_kcode 
    , assigned_earliest_date_seen 
    --Unassigned CP values 
    , unassigned_cp 
    , unassigned_times_seen 
    , unassigned_got_kcode 
    , unassigned_earliest_date_seen 
    , case 
     when (times_seen_mismatch = 1 or earliest_date_mismatch = 1) 
     then 0 
     else 1 
    end as correct_kcode 
from 
    (
     select 
      ptnt_id 
      , kcode_assigned.cp_id as assigned_cp 
      , kcode_zero.cp_id as unassigned_cp 
      --case to determine where times_seen of assigned cp 
      --is less than that of an unassigned cp 
      , case 
       when kcode_zero.times_seen > kcode_assigned.times_seen 
       then 1 
       else 0 
      end as times_seen_mismatch 
      --case to determine where times_seen of assigned cp 
      --equals times_seen of unassigned cp and the unassigned cp 
      --saw the patient on an earlier date than the assigne cp 
      , case 
       when kcode_zero.times_seen = kcode_assigned.times_seen 
        and kcode_zero.earliest_date_seen < kcode_assigned.earliest_date_seen 
       then 1 
       else 0 
      end as earliest_date_mismatch 
      --Assigned CP fields 
      , kcode_assigned.times_seen as assigned_times_seen 
      , kcode_assigned.got_kcode as assigned_got_kcode 
      , kcode_assigned.earliest_date_seen as assigned_earliest_date_seen 
      --Unassigned CP fields 
      , kcode_zero.times_seen as unassigned_times_seen 
      , kcode_zero.got_kcode as unassigned_got_kcode 
      , kcode_zero.earliest_date_seen as unassigned_earliest_date_seen 
     from 
      --derived table to return only those 
      --records where kcode assigned 
      (
       select 
        ptnt_id 
        , cp_id 
        , times_seen 
        , got_kcode 
        , earliest_date_seen 
       from 
        [your table] 
       where 
        got_kcode > 0 
      ) kcode_assigned 
      left outer join 
       --derived table to return only those 
       --records where kcode was not assigned 
       (
        select 
         ptnt_id 
         , cp_id 
         , times_seen 
         , got_kcode 
         , earliest_date_seen 
        from 
         [your table] 
        where 
         got_kcode = 0 
       ) kcode_zero 
        on kcode_assigne.ptnt_id = kcode_zero.ptnt_id 
    ) validate 
where 
    1=1 
    and (times_seen_mismatch = 1 or earliest_date_mismatch = 1) 
+0

私は本質的にその列を無視しています。なぜなら、後でそれを得るべきものと比較するためです。 GOT_KCODE列は、kcodeが割り当てられた人のリストです(数字が0以外の場合)が、割り当てられた値のエラーを検索し、割り当てられた場所を確認しようとしていますが、取得してはいけません。 –

+0

あなたが書いたことは、割り当てが正しいかどうかを比較するときに便利です。私は彼らがそれを正しいと1つまたは0を別の列に入れている場合、数学的なチェックをクエリを記述する必要があります。各患者の間で、その患者を最も見た医者はkcodeを取得すべきです。両者が等しい場合(両方とも1であるとする)、最も早い日付を探します。 –

+0

あなたの質問から私はこれを得ましたhttp://imgur.com/LKD5JSc これは私に何を示していますか? –

0

は何あなたの結果は次のようになりたいですか? Got_Kcode行に0の横に数字がある場合は、CP_IDの横に新しい列を挿入します。

+0

最後に、私のテーブルストアドプロシージャを更新して、CORRECT_KCODEテーブルに医者がどこにkcodeと0を持っているかを確認したいと思います。 –

関連する問題