2016-04-29 5 views
2

У меня возникли проблемы с присоединением 2 таблиц и точным фильтром данных. При необходимости я могу немного изменить таблицы. Я бегу Microsoft SQL Server 2008.Соедините 2 таблицы - заполните отсутствующие даты

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 

и так далее

Каждый фонд имеет свои собственные 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 

и так далее

Моя цель состоит в том, чтобы выяснить, сколько доля клиента удерживается в определенный день и цена за акцию.

Если я просто соединить 2 таблицы ON (tableA.System_Code = tableB.System_Code), я получаю это:

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 

Если я соединить 2 таблицы вместе ГДЕ 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 

Как вы можете видеть, это почти идеально, за исключением последних 2 ряда

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 

Поскольку есть покупка сделана на 02/26/2016, первая строка с датой покупки 02/21/2016 должна упасть. Желательным результатом будет:

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 

Надеюсь, что я четко передаю свои баллы. ТИА!

+0

Вы делаете ваши очки очень ясно! Можете ли вы сделать sqlFiddle с тестовыми данными? – gh9

ответ

0

Ваш последний запрос должен выглядеть примерно так:

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

Это не сработает. Как указано в вопросе, он создает повторяющиеся записи, если я просто укажу, где B.Date> = A.Purchase. – spiderlily

0

Попробуйте это:

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 
Смежные вопросы