Sql 子选择中的外部表引用

Sql 子选择中的外部表引用,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,我有两张表,一张代表股票交易: 吸墨纸 TradeDate Symbol Shares Price 2014-09-02 ABC 100 157.79 2014-09-10 ABC 200 72.50 2014-09-16 ABC 100 36.82 以及存储所有符号的股票拆分历史记录的: 拆分 SplitDate Symbol Factor 2014-09-08 ABC 2

我有两张表,一张代表股票交易:

吸墨纸

TradeDate    Symbol   Shares    Price
2014-09-02   ABC      100       157.79
2014-09-10   ABC      200       72.50
2014-09-16   ABC      100       36.82
以及存储所有符号的股票拆分历史记录的:

拆分

SplitDate    Symbol   Factor
2014-09-08   ABC      2
2014-09-15   ABC      2
2014-09-20   DEF      2
我正试图写一份反映交易的报告,包括他们当前的分割调整系数应该是多少。对于这些表值,我希望报告如下所示:

TradeDate    Symbol   Shares   Price    Factor
2014-09-02   ABC      100      157.79   4
2014-09-10   ABC      200      72.50    2
2014-09-16   ABC      100      36.82    1
第一列直接取自吸墨纸-系数应代表自交易发生以来发生的分割调整(价格未分割调整)。 使问题复杂化的是,每个符号可能有多个拆分,这意味着我不能只
外部连接拆分表
,否则我将开始复制行

我有一个子查询,我从中改编,允许我计算行的乘积,按符号分组,但是我如何只返回所有拆分记录的乘积,拆分日期发生在TradeDate之后

类似以下的查询

SELECT tb.TradeDate, tb.Symbol, tb.Shares, tb.Price, ISNULL(s.Factor, 1) AS Factor
    FROM Blotter tb
    LEFT OUTER JOIN (
        SELECT Symbol, EXP(Factor) AS Factor
            FROM
                (SELECT Symbol, SUM(LOG(ABS(NULLIF(Factor, 0)))) AS Factor
                    FROM Splits s
                    WHERE s.SplitDate > tb.TradeDate   -- tb is unknown here
                    GROUP BY Symbol
                ) splits) s 
         ON s.Symbol = tb.Symbol
返回错误“Msg 4104,级别16,状态1,第1行。无法绑定多部分标识符“tb.TradeDate”

如果没有内部
WHERE
子句,我会得到如下结果:

TradeDate    Symbol   Shares   Price    Factor
2014-09-02   ABC      100      157.79   4
2014-09-10   ABC      200      72.50    4
2014-09-16   ABC      100      36.82    4

更新不能保证Blotter中的交易行是唯一的,因此我认为排除了一种建议的解决方案,即使用
分组方式

一种不太改变逻辑的方法是将因子计算放入表值函数中:

create function dbo.FactorForDate(
    @Symbol char(4), @TradeDate datetime
) returns table as
return (
    select
        exp(Factor) as Factor
    from (
        select
            sum(log(abs(nullif(Factor, 0)))) as Factor
        from
            Splits s 
        where
            s.SplitDate > @TradeDate and
            s.Symbold = @Symbol
    ) splits
);

select
    tb.TradeDate, 
    tb.Symbol, 
    tb.Shares, 
    tb.Price, 
    isnull(s.Factor, 1) as Factor
from
    Blotter tb
        outer apply
    dbo.FactorForDate(tb.Symbol, tb.TradeDate) s;
在一个语句中执行此操作将类似于:

select
    tb.TradeDate, 
    tb.Symbol, 
    tb.Shares, 
    tb.Price, 
    isnull(exp(sum(log(abs(nullif(factor, 0))))), 1) as Factor
from
    Blotter tb
        left outer join
    Symbol s
         on s.Symbol = tb.Symbol and s.SplitDate > tb.TradeDate
group by
    tb.TradeDate, 
    tb.Symbol, 
    tb.Shares, 
    tb.Price;
如果你能让它工作起来,它的性能可能会更好


对于任何语法错误,我深表歉意,目前无法访问SQL。

有趣的想法-如果没有任何查询建议,我将在明天的工作中试一试。单一查询解决方案的一个问题是,不能保证Blotter中的行是唯一的。为了回答这个问题,我把它缩减到了一些基本字段,但即使有完整的表格,也完全有可能会发生多个匹配交易,因此因子值会因此发生偏移。