2016-04-29 12 views
2

Ich habe Probleme bei der Verknüpfung von 2 Tabellen und Filtern der Daten genau. Ich kann die Tabellen leicht ändern, wenn es sein muss. Ich bin mit Microsoft SQL Server 2008.Beitreten 2 Tabellen - füllen Sie fehlende Daten

Table A 
System_Code | Name   | Client ID| Fund | Purchase_Date | Shares 
1   | Lily   | 123456 | 001 | 02/21/2016  | 100 
1   | Lily   | 123456 | 001 | 02/26/2016  | 200 
2   | Lily   | 123456 | 002 | 02/24/2016  | 250 

und so weiter

Jeder Fonds hat seine eigene System_Code

Table B 
System_Code | Date   | Price 
1   | 02/21/2016  | 10 
1   | 02/22/2016  | 10 
1   | 02/23/2016  | 9 
1   | 02/24/2016  | 10 
1   | 02/25/2016  | 11 
1   | 02/26/2016  | 10.5 

und so weiter

Mein Ziel ist es herauszufinden, wie viel Teilen eines Kunden hält an einem bestimmten Tag und den Preis pro Aktie.

Wenn ich einfach 2 Tabellen verbinden ON (tableA.System_Code = tableB.System_Code), bekomme ich diese:

System_Code| Name | Client ID| Fund |Purchase_Date|Shares| Date  | Price 
1   | Lily | 123456 | 001 |02/21/2016 |100 |02/21/2016| 10 
1   | Lily | 123456 | 001 |02/26/2016 |200 |02/26/2016| 10.5 

Wenn ich beitreten 2 Tische zusammen WHERE tableB.Date> = tableA.Purchase

System_Code| Name | Client ID| Fund |Purchase_Date|Shares| Date  | Price 
1   | Lily | 123456 | 001 |02/21/2016 |100 |02/21/2016| 10 
1   | Lily | 123456 | 001 |02/21/2016 |100 |02/22/2016| 10 
1   | Lily | 123456 | 001 |02/21/2016 |100 |02/23/2016| 9 
1   | Lily | 123456 | 001 |02/21/2016 |100 |02/24/2016| 10 
1   | Lily | 123456 | 001 |02/21/2016 |100 |02/25/2016| 11 
1   | Lily | 123456 | 001 |02/21/2016 |100 |02/26/2016| 10.5 
1   | Lily | 123456 | 001 |02/26/2016 |200 |02/26/2016| 10.5 

Wie Sie sehen können, ist es fast perfekt bis auf die letzten zwei Zeilen

1   | Lily | 123456 | 001 |02/21/2016 |100 |02/26/2016| 10.5 
1   | Lily | 123456 | 001 |02/26/2016 |200 |02/26/2016| 10.5 

Da es einen Kauf gemacht auf 26.02.2016, die erste Zeile mit Kaufdatum vom 21.02.2016 soll fallen. Das gewünschte Ergebnis wäre:

System_Code| Name | Client ID| Fund |Purchase_Date|Shares| Date  | Price 
1   | Lily | 123456 | 001 |02/21/2016 |100 |02/21/2016| 10 
1   | Lily | 123456 | 001 |02/21/2016 |100 |02/22/2016| 10 
1   | Lily | 123456 | 001 |02/21/2016 |100 |02/23/2016| 9 
1   | Lily | 123456 | 001 |02/21/2016 |100 |02/24/2016| 10 
1   | Lily | 123456 | 001 |02/21/2016 |100 |02/25/2016| 11 
1   | Lily | 123456 | 001 |02/26/2016 |200 |02/26/2016| 10.5 

Hoffe ich meine Punkte klar vermitteln. TIA!

+0

Sie Ihre Punkte klar zu machen! Können Sie ein sqlFiddle mit Testdaten machen? – gh9

Antwort

0

Ihre letzte Abfrage sollte so ähnlich aussehen:

select * 
from A 
    left join B 
    on (A.System_Code = B.System_Code) 
where B.Date >= A.Purchase 
+0

Das würde nicht funktionieren. Wie in der Frage angegeben, erstellt es doppelte Einträge, wenn ich einfach angeben, wo B.Date> = A.Purchase. – spiderlily

0

Try this:

SELECT a.* 
    ,b.* 
FROM dbo.Table_A a 
JOIN table_b b ON b.System_Code = a.System_Code 
WHERE b.DATE >= a.Purchase_Date 

EXCEPT 

SELECT a.System_Code 
    ,a.NAME 
    ,a.Client_ID 
    ,a.Fund 
    ,a.Purchase_Date 
    ,a.Shares 
    ,b.System_Code 
    ,a2.Purchase_Date AS DATE 
    ,b.Price 
FROM dbo.Table_A a 
JOIN TABLE_a a2 ON a.System_Code = a2.System_Code 
    AND a.Purchase_Date < a2.Purchase_Date 
JOIN table_b b ON b.System_Code = a.System_Code 
Verwandte Themen