2011-09-18 2 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이 아님)이 포함되어 있으면 해당 사람이 이미 환불되었음을 의미합니다. 따라서 데이터를 통해 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 서버를 가지고 있지 않지만 나는 그렇게 여기에 몇 가지 일반적인 SQL, 그것은 내가 테이블 paymentlog

+1

** IF ** OP는 SQL Server를 사용합니다 .... 그는 지정하지 않았습니다 ..... –

관련 문제