2016-05-03 16 views
0

Ich habe zwei Tabellen 1. Teilnahmeberechtigung 2. DebitCardTransactionÜberprüfen Sie, ob Datum fallen zwischen Datumsbereich ist SQL Server

Ich möchte Spalte Status auf ‚Y‘ in debitcardtransaction Tabelle aktualisieren, wenn der Service Datum fallen zwischen jeder ist von BenefitEffectiveDate & GracePeriodEndDate in der Eignungstabelle sonst 'N'

gibt es zwei allgemeine Felder zwischen diesen beiden Tabellen. eine ist SSN & Sekunde ist EIN.

für aktuelles Beispiel Service ist 2016.03.02 in debitcardtransaction Tabelle für SSN = 139.668.966 und EIN = 137580

Jetzt muss ich sehen, ob dieser Dienst Datum fallen zwischen Tabelle BenefitEffectiveDate & GracePeriodEndDate von der Wählbarkeit ist die SSN hat = 139668966 und EIN = 137580

für dieses Beispiel ist es nicht für SSN zwischen jedem Datumsbereich BenefitEffectiveDate & GracePeriodEndDate fallen = 139668966 und EIN = 137580

Kann jemand bitte helfen sie mir, wie zu erreichen Dies?

Es folgt Förderfähigkeit Tabellenstruktur

+----------------------+--------------------+-----------+--------+ 
| BenefitEffectiveDate | GracePeriodEndDate | SSN | EIN | 
+----------------------+--------------------+-----------+--------+ 
| 2016-01-01   | 2016-01-31   | 139668966 | 137580 | 
| 2016-03-01   | 2016-03-30   | 139668966 | 137580 | 
| 2016-04-06   | 2016-05-30   | 139668966 | 137580 | 
| 2016-01-01   | 2017-02-02   | 539980084 | 137580 | 
| 2016-01-01   | 2016-06-01   | 570728149 | 137580 | 
| 2016-08-01   | 2016-10-02   | 570728149 | 137580 | 
| 2016-01-01   | 2017-02-02   | 624621535 | 137580 | 
| 2016-01-01   | 2017-02-02   | 651442905 | 137580 | 
| 2016-01-01   | 2017-02-02   | 651442905 | 137580 | 
+----------------------+--------------------+-----------+--------+ 

Es folgt DebitcardTransaction Tabelle

+-------------+--------+-----------+--------+ 
| ServiceDate | EIN | SSN | Status | 
+-------------+--------+-----------+--------+ 
| 2016-01-20 | 137580 | 139668966 |  | 
| 2016-02-01 | 137580 | 139668966 |  | 
| 2016-03-02 | 137580 | 139668966 |  | 
| 2016-06-02 | 137580 | 139668966 |  | 
| 2016-02-02 | 137580 | 539980084 |  | 
| 2016-02-02 | 137580 | 570728149 |  | 
| 2016-11-02 | 137580 | 570728149 |  | 
| 2016-01-01 | 137580 | 624621535 |  | 
| 2016-02-01 | 137580 | 651442905 |  | 
+-------------+--------+-----------+--------+ 

Suche Ausgabe folgende

+-------------+--------+-----------+--------+ 
| ServiceDate | EIN | SSN | Status | 
+-------------+--------+-----------+--------+ 
| 2016-01-20 | 137580 | 139668966 | Y  | 
| 2016-02-01 | 137580 | 139668966 | N  | 
| 2016-03-02 | 137580 | 139668966 | Y  | 
| 2016-06-02 | 137580 | 139668966 | N  | 
| 2016-02-02 | 137580 | 539980084 | Y  | 
| 2016-02-02 | 137580 | 570728149 | Y  | 
| 2016-11-02 | 137580 | 570728149 | N  | 
| 2016-01-01 | 137580 | 624621535 | Y  | 
| 2016-02-01 | 137580 | 651442905 | Y  | 
+-------------+--------+-----------+--------+ 
+0

, dass eine gute Frage. Löschen, mit Beispieldaten und erwarteter Ausgabe. Das einzige was fehlt ist * Was hast du bisher probiert? * Aber trotzdem: +1 von meiner Seite! – Shnugo

Antwort

0

Try this,

UPDATE DT 
SET  DT.Status = (CASE WHEN EXISTS(
          SELECT 1 
          FROM eligibility E 
          WHERE E.SSN = DT.SSN AND E.EIN = DT.EIN 
           AND DT.ServiceDate BETWEEN E.BenefitEffectiveDate AND GracePeriodEndDate 
          ) THEN 'Y' ELSE 'N' END) 
FROM DebitcardTransaction DT 
+1

Hallo Abdul, Ihr Code könnte die gleiche Zeile mehrmals umkehren. Wenn es mehr Einträge in die gleiche Kombination von EID und SSN gibt es vielleicht zufällige Ergebnisse ... – Shnugo

+0

thanx @Shnugo sein, dachte ich Kombination von EID und SSN einzigartig ist, das Skript geändert. –

0

Dies ist ein funktionierendes Beispiel mit einem aktualisierbar CTE:

DECLARE @tbl1 TABLE (BenefitEffectiveDate DATE,GracePeriodEndDate DATE,SSN INT,EIN INT); 
INSERT INTO @tbl1 VALUES 
('2016-01-01','2016-01-31',139668966,137580) 
,('2016-03-01','2016-03-30',139668966,137580) 
,('2016-04-06','2016-05-30',139668966,137580) 
,('2016-01-01','2017-02-02',539980084,137580) 
,('2016-01-01','2016-06-01',570728149,137580) 
,('2016-08-01','2016-10-02',570728149,137580) 
,('2016-01-01','2017-02-02',624621535,137580) 
,('2016-01-01','2017-02-02',651442905,137580) 
,('2016-01-01','2017-02-02',651442905,137580); 

DECLARE @tbl2 TABLE(ServiceDate DATE,EIN INT,SSN INT,Status CHAR(1)); 
INSERT INTO @tbl2 VALUES 
('2016-01-20',137580,139668966,NULL) 
,('2016-02-01',137580,139668966,NULL) 
,('2016-03-02',137580,139668966,NULL) 
,('2016-06-02',137580,139668966,NULL) 
,('2016-02-02',137580,539980084,NULL) 
,('2016-02-02',137580,570728149,NULL) 
,('2016-11-02',137580,570728149,NULL) 
,('2016-01-01',137580,624621535,NULL) 
,('2016-02-01',137580,651442905,NULL); 

WITH myCTE AS 
(
    SELECT * 
      ,CASE WHEN EXISTS(SELECT 1 
          FROM @tbl1 AS t1 
          WHERE t1.EIN=t2.EIN 
           AND t1.SSN=t2.SSN 
           AND t2.ServiceDate>=t1.BenefitEffectiveDate 
           AND t2.ServiceDate< CAST(t1.GracePeriodEndDate AS DATETIME)+1) 
       THEN 'Y' ELSE 'N' END AS NewStatus 
    FROM @tbl2 AS t2 
) 
UPDATE myCTE SET Status = NewStatus; 

SELECT * FROM @tbl2; 
0

ich es in einer select-Anweisung versucht haben, und enthalten alle Bedingungen auf der Verbindung. Bitte überprüfen Sie unter:

SELECT 
    T2.ServiceDate 
    ,T2.SSN 
    ,T2.EIN 
    ,[Status] = CASE WHEN T1.BenefitEffectiveDate IS NULL THEN 'N' ELSE 'Y' END 
FROM DebitcardTransaction T2 
LEFT JOIN Eligibility T1 
    ON T1.SSN = T2.SSN 
    AND T1.EIN = T2.EIN 
    AND T2.ServiceDate BETWEEN T1.BenefitEffectiveDate AND T1.GracePeriodEndDate 
GROUP BY 
    T2.ServiceDate 
    ,T2.SSN 
    ,T2.EIN 
    ,T1.BenefitEffectiveDate 
ORDER BY 2 
  • Gruppe von wegen linken Duplikate heraus ist beizutreten.
  • Sortieren nach ist nur, um Ihre exakte Ausgabe nachzuahmen.

Wenn dies nur ein schlechten Daten ist, dann müssen Sie nicht die Gruppe von:

| 2016-01-01   | 2017-02-02   | 651442905 | 137580 | 
| 2016-01-01   | 2017-02-02   | 651442905 | 137580 | 
Verwandte Themen