2016-04-27 62 views
4

我期待从以下两个表格从SQL服务器的多个表两个日期之间获取记录

得到记录,如果存在未在交易的资格存在的记录参与者SSN和EIN交易的地方ServiceDate在BenefitEffectiveDate和GracePeriodEndDate内。

对于给定的参与者SSN和EIN,对于具有不同计划周期的资格表中的相同参与者可以有多个记录。

例如在下面的脚本中,在合格表中存在两个记录,用于participantSSN = 645075498,并且这两个记录具有不同的BenefitEffectiveDate和GracePeriodEndDate,从此表中我们必须取最小的BenefitEffectiveDate和最大的GracePeriodEndDate。这意味着这个参与者的最低日期是2015年1月1日,最大日期是2018-01-01

现在在交易表中我有相同participantSSN = 645075498其中有交易日期是2016年2月10日这是秋天最低BenefitEffectiveDate和资格表最大GracePeriodEndDate对之间participantSSN = 645075498

我想记录我的输出participantSSN = 645075498

我怎样才能实现呢?到目前为止,我已经写下了下面的查询,它不会在输出结果中给我participantSSN = 645075498。

这是我预期的结果

| Tid | TPAId | EIN | ParticipantSSN | ParticipantFirstName | ParticipantLastName | TPAParentTransactionId | TPATransactionId | ServiceDate | TransactionDate | Amt | 

| 118 | PayFlex | 54401 |  852258852 | GABRIEL    | BRYANT    |    45758201 |   55277801 | 2016-01-01 | 2016-01-02  | 15 | 
| 124 | PayFlex | 54407 |  420145857 | CAROLYN    | WOMAC    |    45758207 |   55277807 | 2016-03-15 | 2016-03-15  | 60 | 
| 125 | PayFlex | 54408 |  345658570 | THOMAS    | FAVELA    |    45758208 |   55277808 | 2016-03-16 | 2016-03-18  | 60 | 
| 126 | PayFlex | 54409 |  541575015 | BETTY    | DAVIS    |    45758209 |   55277809 | 2016-03-17 | 2016-03-20  | 60 | 
| 127 | PayFlex | 54410 |  541575015 | BETTY    | DAVIS    |    45758209 |   55277809 | 2016-03-17 | 2016-03-20  | 60 | 
| 128 | PayFlex | 54409 |  541575015 | BETTY    | DAVIS    |    45758210 |   55277809 | 2016-03-17 | 2016-03-20  | 60 | 
| 129 | PayFlex | 54409 |  541575016 | MANDY    | THOMPSON   |    45758211 |   55277810 | 2016-03-18 | 2016-03-20  | 80 | 
| 130 | PayFlex | 54409 |  541575018 | FRANCIS    | GRAYER    |    45758212 |   55277811 | 2016-03-19 | 2016-03-22  | 79 | 
| 122 | PayFlex | 54405 |  645075498 | MARY     | WILSON    |    45758205 |   55277805 | 2016-02-07 | 2016-02-10  | 100 | 

我目前的SQL查询

SELECT ParticipantFirstName, ServiceDate, * 
FROM DebitCardTransaction d 
WHERE NOT EXISTS 
(
    SELECT 1 
    FROM Eligibility e 
    WHERE e.TPAId = d.TPAId 
     AND e.EIN = d.EIN 
     AND e.ParticipantSSN = d.ParticipantSSN 
    AND d.ServiceDate BETWEEN BenefitEffectiveDate AND GracePeriodEndDate 
) 

以上是我当前的查询及以下的样品创建表并插入样本数据脚本

CREATE TABLE Eligibility(
EligibilityId  INTEGER PRIMARY KEY 
,TPAId    VARCHAR(7) 
,EIN     INTEGER 
,SubscriberId   INTEGER 
,ParticipantFirstName VARCHAR(9) 
,ParticipantLastName VARCHAR(9) 
,ParticipantSSN  INTEGER 
,BenefitEffectiveDate DATE 
,GracePeriodEndDate DATE 
); 

INSERT INTO Eligibility(EligibilityId,TPAId,EIN,SubscriberId,ParticipantFirstName,ParticipantLastName,ParticipantSSN,BenefitEffectiveDate,GracePeriodEndDate) VALUES (227,'PayFlex',54406,15857506,'TIM','HOPE',138764141,'1/1/2016','2/2/2017'); 
INSERT INTO Eligibility(EligibilityId,TPAId,EIN,SubscriberId,ParticipantFirstName,ParticipantLastName,ParticipantSSN,BenefitEffectiveDate,GracePeriodEndDate) VALUES (228,'PayFlex',54401,15857501,'BRIEL','BRYANT',852258851,'1/1/2016','2/2/2017'); 
INSERT INTO Eligibility(EligibilityId,TPAId,EIN,SubscriberId,ParticipantFirstName,ParticipantLastName,ParticipantSSN,BenefitEffectiveDate,GracePeriodEndDate) VALUES (229,'PayFlex',54402,15857502,'LISA','PEREZ',292225757,'1/1/2016','2/2/2017'); 
INSERT INTO Eligibility(EligibilityId,TPAId,EIN,SubscriberId,ParticipantFirstName,ParticipantLastName,ParticipantSSN,BenefitEffectiveDate,GracePeriodEndDate) VALUES (230,'PayFlex',54403,15857503,'ALEXANDER','JEFFERSON',643035714,'1/1/2016','2/2/2017'); 
INSERT INTO Eligibility(EligibilityId,TPAId,EIN,SubscriberId,ParticipantFirstName,ParticipantLastName,ParticipantSSN,BenefitEffectiveDate,GracePeriodEndDate) VALUES (231,'PayFlex',54404,15857504,'SHIRLEY','PEREZ',458250578,'1/1/2016','2/2/2017'); 
INSERT INTO Eligibility(EligibilityId,TPAId,EIN,SubscriberId,ParticipantFirstName,ParticipantLastName,ParticipantSSN,BenefitEffectiveDate,GracePeriodEndDate) VALUES (232,'PayFlex',54405,15857505,'MARY','WILSON',645075498,'1/1/2015','2/2/2016'); 
INSERT INTO Eligibility(EligibilityId,TPAId,EIN,SubscriberId,ParticipantFirstName,ParticipantLastName,ParticipantSSN,BenefitEffectiveDate,GracePeriodEndDate) VALUES (233,'PayFlex',54405,15857505,'MARY','WILSON',645075498,'1/1/2016','2/2/2018'); 



CREATE TABLE DebitCardTransaction(
Tid     INTEGER PRIMARY KEY 
,TPAId     VARCHAR(7) 
,EIN     INTEGER 
,ParticipantSSN   INTEGER 
,ParticipantFirstName VARCHAR(9) 
,ParticipantLastName VARCHAR(9) 
,TPAParentTransactionId INTEGER 
,TPATransactionId  INTEGER 
,ServiceDate   DATE 
,TransactionDate  DATE 
,Amt     INTEGER 
); 

INSERT INTO DebitCardTransaction(Tid,TPAId,EIN,ParticipantSSN,ParticipantFirstName,ParticipantLastName,TPAParentTransactionId,TPATransactionId,ServiceDate,TransactionDate,Amt) VALUES (118,'PayFlex',54401,852258852,'GABRIEL','BRYANT',45758201,55277801,'1/1/2016','1/2/2016',15); 
INSERT INTO DebitCardTransaction(Tid,TPAId,EIN,ParticipantSSN,ParticipantFirstName,ParticipantLastName,TPAParentTransactionId,TPATransactionId,ServiceDate,TransactionDate,Amt) VALUES (119,'PayFlex',54402,292225757,'LISA','PEREZ',45758202,55277802,'2/1/2016','2/2/2016',50); 
INSERT INTO DebitCardTransaction(Tid,TPAId,EIN,ParticipantSSN,ParticipantFirstName,ParticipantLastName,TPAParentTransactionId,TPATransactionId,ServiceDate,TransactionDate,Amt) VALUES (120,'PayFlex',54403,643035714,'ALEXANDER','JEFFERSON',45758203,55277803,'2/2/2016','2/3/2016',50); 
INSERT INTO DebitCardTransaction(Tid,TPAId,EIN,ParticipantSSN,ParticipantFirstName,ParticipantLastName,TPAParentTransactionId,TPATransactionId,ServiceDate,TransactionDate,Amt) VALUES (121,'PayFlex',54404,458250578,'SHIRLEY','PEREZ',45758204,55277804,'2/3/2016','2/5/2016',50); 
INSERT INTO DebitCardTransaction(Tid,TPAId,EIN,ParticipantSSN,ParticipantFirstName,ParticipantLastName,TPAParentTransactionId,TPATransactionId,ServiceDate,TransactionDate,Amt) VALUES (122,'PayFlex',54405,645075498,'MARY','WILSON',45758205,55277805,'2/7/2016','2/10/2016',100); 
INSERT INTO DebitCardTransaction(Tid,TPAId,EIN,ParticipantSSN,ParticipantFirstName,ParticipantLastName,TPAParentTransactionId,TPATransactionId,ServiceDate,TransactionDate,Amt) VALUES (123,'PayFlex',54406,138764141,'TIM','HOPE',45758206,55277806,'2/10/2016','2/11/2016',110); 
INSERT INTO DebitCardTransaction(Tid,TPAId,EIN,ParticipantSSN,ParticipantFirstName,ParticipantLastName,TPAParentTransactionId,TPATransactionId,ServiceDate,TransactionDate,Amt) VALUES (124,'PayFlex',54407,420145857,'CAROLYN','WOMAC',45758207,55277807,'3/15/2016','3/15/2016',60); 
INSERT INTO DebitCardTransaction(Tid,TPAId,EIN,ParticipantSSN,ParticipantFirstName,ParticipantLastName,TPAParentTransactionId,TPATransactionId,ServiceDate,TransactionDate,Amt) VALUES (125,'PayFlex',54408,345658570,'THOMAS','FAVELA',45758208,55277808,'3/16/2016','3/18/2016',60); 
INSERT INTO DebitCardTransaction(Tid,TPAId,EIN,ParticipantSSN,ParticipantFirstName,ParticipantLastName,TPAParentTransactionId,TPATransactionId,ServiceDate,TransactionDate,Amt) VALUES (126,'PayFlex',54409,541575015,'BETTY','DAVIS',45758209,55277809,'3/17/2016','3/20/2016',60); 
INSERT INTO DebitCardTransaction(Tid,TPAId,EIN,ParticipantSSN,ParticipantFirstName,ParticipantLastName,TPAParentTransactionId,TPATransactionId,ServiceDate,TransactionDate,Amt) VALUES (127,'PayFlex',54410,541575015,'BETTY','DAVIS',45758209,55277809,'3/17/2016','3/20/2016',60); 
INSERT INTO DebitCardTransaction(Tid,TPAId,EIN,ParticipantSSN,ParticipantFirstName,ParticipantLastName,TPAParentTransactionId,TPATransactionId,ServiceDate,TransactionDate,Amt) VALUES (128,'PayFlex',54409,541575015,'BETTY','DAVIS',45758210,55277809,'3/17/2016','3/20/2016',60); 
INSERT INTO DebitCardTransaction(Tid,TPAId,EIN,ParticipantSSN,ParticipantFirstName,ParticipantLastName,TPAParentTransactionId,TPATransactionId,ServiceDate,TransactionDate,Amt) VALUES (129,'PayFlex',54409,541575016,'MANDY','THOMPSON',45758211,55277810,'3/18/2016','3/20/2016',80); 
INSERT INTO DebitCardTransaction(Tid,TPAId,EIN,ParticipantSSN,ParticipantFirstName,ParticipantLastName,TPAParentTransactionId,TPATransactionId,ServiceDate,TransactionDate,Amt) VALUES (130,'PayFlex',54409,541575018,'FRANCIS','GRAYER',45758212,55277811,'3/19/2016','3/22/2016',79); 
+0

请发表预期结果。 –

+0

@FelixPamittan我在我的问题中更新了我的预期结果 – M005

+0

Mary为什么要在结果集中?她的最低“BenefitEffectiveDate”和最大“GracePeriodEndDate”之间有一笔交易。 –

回答

0

我认为这是你所追求的;

SELECT 
d.Tid 
,d.TPAId 
,d.EIN 
,d.ParticipantSSN 
,d.ParticipantFirstName 
,d.ParticipantLastName 
,d.TPAParentTransactionId 
,d.TPATransactionId 
FROM DebitCardTransaction d 
LEFT JOIN (SELECT ParticipantSSN, MIN(BenefitEffectiveDate) BenefitEffectiveDate, MAX(GracePeriodEndDate) GracePeriodEndDate FROM #Eligibility GROUP BY ParticipantSSN) e 
ON d.ParticipantSSN = e.ParticipantSSN 
AND d.TransactionDate BETWEEN e.BenefitEffectiveDate AND e.GracePeriodEndDate 
WHERE e.ParticipantSSN IS NULL OR d.ParticipantSSN = 645075498 
ORDER BY d.Tid 

它给人的结果集,你已经问除了TID 122(玛丽·威尔逊),不符合标准,因为我理解他们。

+0

感谢您的回答,但我希望玛丽威尔逊被纳入我的结果集。 – M005

+1

你为什么要让玛丽威尔逊展示?你已经忍受了每个在其BenefitEffectiveDate和其GracePeriodEndDate之间具有TransactionDate的人。我已经解开了我的答案,这将得到玛丽真正的有效和宽限期的日期,但她仍然会被压制。玛丽需要包含哪些特别的东西? –

+0

我刚刚更新了where子句以强制Mary进入结果集,我仍然有兴趣了解为什么她需要包含在标准 –