2011-09-18 21 views
0

私の質問のタイトルはどういうことか分かりませんでしたので、残念です。この結果からSQLクエリを作成するにはどうすればよいですか?

私はこの問題を解決するためにSQLクエリを作成しようとしています。薬局から払い戻されるべきメンバーの数。

例:私は薬局に行きました。私はワクチンを受け取りましたが、誤って私は自分のポケットから支払いました。だから、薬局はその額を返済する必要があります。

MemberId Name  ServiceDate PresNumber PersonId ClaimId AdminFee(in $) 

    1  John  1/1/2011   123  345   456   0 
    1  John  1/21/2011   123  345   987  20 
    2  Mike  2/3/2011   234  567   342   0 
    2  Mike  2/25/2011   234  567   564  30 
    5  Linda  1/4/2011   432  543   575   0 
    5  Linda  4/6/2011   987  543   890   0 
    6  Sonia  2/6/2011   656  095   439   0 

このデータは弁償していない得たことを薬局からのすべてのメンバーを示しています。私のようなデータを持って言うことができます。

私はAdminFee 0のメンバーを見つける必要がありますが、同じPresNumberを持つ同じメンバー、ServiceDateが元のレコードの30日以内に収まる同じPersonIdの別のレコードをチェックする必要があります。
別のレコードがこの基準を満たし、AdminFeeフィールドに値(NOT 0)が含まれている場合、その人はすでに払い戻されていることを意味します。したがって、データから、JohnとMikeは既に払い戻されており、LindaとSoniaは払い戻される必要があります。

これについてSQLクエリを書く方法を教えてもらえますか?

答えて

2

あなたが使っているものをSQLエンジン言及していないと呼ばれるこの

Select memberid 
from PaymentLog p 
inner join PaymentLog d on p.serviceid = d.serviceid 
         and p.memberid = d.memberid 
         and p.personid = d.personid 
Where adminfee = 0 
and datediff(day, p.servicedate, d.servicedate) < 30 

ようにすべきだと思います。

-- Already reimbursed 
SELECT * FROM YourTable YT1 WHERE AdminFee = 0 AND EXISTS 
    (SELECT * FROM YourTable YT2 
     WHERE YT2.MemberID = YT1.MemberID AND 
       YT2.PresNumber = YT1.PresNumber AND 
       YT2.ServiceDate >= YT1.ServiceDate - 30 AND 
       AdminFee > 0) 

-- Need reimbursement 
SELECT * FROM YourTable YT1 WHERE AdminFee = 0 AND NOT EXISTS 
    (SELECT * FROM YourTable YT2 
     WHERE YT2.MemberID = YT1.MemberID AND 
       YT2.PresNumber = YT1.PresNumber AND 
       YT2.ServiceDate >= YT1.ServiceDate - 30 AND 
       AdminFee > 0) 

または

-- Both in one. 
SELECT YT1.*, 
    CASE WHEN YT2.MemberID IS NULL THEN False ELSE True END AS AlreadyReimbursed 
    FROM YourTable YT1 JOIN YourTable YT2 ON 
     YT1.MemberID = YT2.MemberID AND 
     YT1.PresNumber = YT2.PresNumber AND 
     YT1.ServiceDate <= YT2.ServiceDate + 30 
    WHERE YT1.AdminFee = 0 AND YT2.AdminFee > 0) 
+0

注:これは私が最初に忘れた*同じ*処方番号の前回の払い戻しを探しているという要件を反映するためにこれを編集しただけです。 –

0

SQL Serverでdatediff関数を使用し、日を過ぎて上記のテーブルを他のエイリアスに結合するパラメータとして使用する必要があります。私は、SQL Serverを持っていませんが、私はので、ここでいくつかの一般的なSQLで、それは私がテーブルpaymentlog

+1

** IF **:あなたは日付数学、あなたが使っているものは何でもエンジンに(第2のオプションで)真/偽のリターンを適応させる必要がありますOPはSQL Serverを使用しています....彼は指定していません..... –

関連する問題