如何从此结果编写sql查询?

时间:2011-09-18 01:04:42

标签: sql

我不确定我的问题的标题是什么,对此感到抱歉。

我正在尝试编写一个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需要报销。

有人可以帮我解决这个问题吗?

2 个答案:

答案 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