Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从该结果编写sql查询?_Sql - Fatal编程技术网

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

如何从该结果编写sql查询?,sql,Sql,我不确定我的问题的标题是什么,对此我很抱歉 我正在尝试编写一个SQL查询,以获得应该从药店报销的会员人数 例如:我去了药房,我接种了疫苗,但我错了,我从口袋里掏钱了。所以现在药房需要偿还我那笔钱。假设我有如下数据: MemberId Name ServiceDate PresNumber PersonId ClaimId AdminFee(in $) 1 John 1/1/2011 123 345

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

我正在尝试编写一个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的成员,但我还需要检查同一成员的另一个记录,该成员具有相同的号码、相同的个人ID,其中ServiceDate在原始记录的30天内。 如果另一条记录符合此条件,并且AdminFee字段包含的值不是0,则表示此人已报销。所以从数据中你可以看到约翰和迈克已经报销了,琳达和索尼娅需要报销

有谁能帮我写一个SQL查询吗?

您需要在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

您没有提到您使用的是什么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)