我不确定我的问题的标题是什么,对此感到抱歉。
我正在尝试编写一个SQL查询来实现no。应该从药房获得报销的会员。
例如:我去了药房,我接种了疫苗但是我从口袋里付了钱。所以现在药房需要偿还我的金额。假设我有以下数据:
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的同一成员的另一条记录,同一个PersonId,其中ServiceDate属于原始记录的30天内。
如果另一条记录符合此条件且AdminFee字段包含值(不是0),则表示该人已经获得报销。因此,根据数据,您可以看到John和Mike已经获得报销,Linda和Sonia需要报销。
有人可以帮我解决这个问题吗?
答案 0 :(得分:2)
您没有提到您正在使用的SQL引擎,因此这里有一些通用SQL。您需要调整日期数学和True / False(在第二个选项中)的返回值,以适应您正在使用的任何引擎:
-- 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)
答案 1 :(得分:0)
您需要在SQL Server中使用datediff
函数并作为参数传递day并通过其他别名加入上表。我没有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