【问题标题】:Join 2 tables - fill in missing dates加入 2 个表格 - 填写缺失的日期
【发布时间】:2016-08-24 19:42:36
【问题描述】:

我在连接 2 个表和精确过滤数据时遇到问题。如果需要,我可以稍微修改表格。我正在运行 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         | 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 个表连接在一起 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

如您所见,除了最后 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

由于在 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

希望我能清楚地表达我的观点。蒂亚!

【问题讨论】:

  • 您的观点非常明确!你能用测试数据做一个 sqlFiddle 吗?

标签: sql sql-server-2008 left-join inner-join


【解决方案1】:

您的最终查询应如下所示:

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

【讨论】:

  • 那行不通。如问题所述,如果我简单地指定 B.Date >= A.Purchase.
【解决方案2】:

试试这个:

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

【讨论】:

    猜你喜欢
    • 2020-07-13
    • 2018-06-24
    • 2018-10-05
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    相关资源
    最近更新 更多