2011-09-18 79 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字段包含的值(不爲0),那麼就意味着這個人已經被報銷。所以從數據中可以看到約翰和邁克已經報銷了,琳達和索尼亞需要報銷。

任何人可以幫助我如何寫這個SQL查詢?

回答

2

你沒有提到你正在使用的SQL引擎,所以這裏是一些通用的SQL。你需要適應的日期數學和真/假的回報(在第二個選項)到任何引擎你使用:

-- 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,但我想應該是這樣的

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 

我叫表paymentlog

+1

** ** IF的OP使用SQL Server ....他沒有具體..... –