Sql 加入2个表格-填写缺失的日期
我在连接两个表和精确过滤数据时遇到问题。如果需要,我可以稍微修改表格。我正在运行Microsoft SQL Server 2008Sql 加入2个表格-填写缺失的日期,sql,sql-server-2008,left-join,inner-join,Sql,Sql Server 2008,Left Join,Inner Join,我在连接两个表和精确过滤数据时遇到问题。如果需要,我可以稍微修改表格。我正在运行Microsoft SQL Server 2008 Table A System_Code | Name | Client ID| Fund | Purchase_Date | Shares 1 | Lily | 123456 | 001 | 02/21/2016 | 100 1 | Lily | 1234
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
等等
每个基金都有自己的系统代码
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
等等
我的目标是找出客户在某一天持有多少股份以及每股价格
如果我只是在(tableA.System\u Code=tableB.System\u 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
如果我将两个表连接在一起,其中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
正如你所看到的,除了最后两行,它几乎是完美的
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
由于在2016年2月26日进行了购买,因此购买日期为2016年2月21日的第一行应减少。预期的结果将是:
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
希望我能清楚地表达我的观点。蒂亚 您的最终查询应该如下所示:
select *
from A
left join B
on (A.System_Code = B.System_Code)
where B.Date >= A.Purchase
试试这个:
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
选择一个*
,b*
来自dbo.Table_A
在b.System\u代码=a.System\u代码上联接表
其中b.DATE>=a.Purchase\u日期
除了
选择一个系统代码
,a.姓名
,a.Client_ID
,a.基金
,a.购买日期
,a股
,b.系统代码
,a2.购买日期为日期
,b.价格
来自dbo.Table_A
在a.System_代码=a2.System_代码上连接表a a2
a.购买日期
那是行不通的。如问题中所述,如果我简单地指定B.Date>=A.Purchase的位置,它会创建重复条目。您的观点非常清楚!你能摆弄一下测试数据吗?