Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 将一个表自身连接起来_Sql Server 2008_Join - Fatal编程技术网

Sql server 2008 将一个表自身连接起来

Sql server 2008 将一个表自身连接起来,sql-server-2008,join,Sql Server 2008,Join,我有一个包含以下列的表ValuationHistory Code | ValuationDate | NetAssetValue | PricePerShare | Subscriptions | Redemptions ABC | 2014-06-30 | 12546.50 | 100.23 | 60 | 70 CEF | 2014-06-30 | 10025.20 | 120.50 | 30

我有一个包含以下列的表ValuationHistory

Code | ValuationDate | NetAssetValue | PricePerShare | Subscriptions | Redemptions  
ABC  | 2014-06-30    | 12546.50      | 100.23        | 60            | 70  
CEF  | 2014-06-30    | 10025.20      | 120.50        | 30            | 20  
ABC  | 2014-07-31    | 12505.50      | 101.50        | 40            | 60  
ABC  | 2014-08-31    | 13051.41      | 102.50        | 35            | 70
现在,用户将从aspx页面选择估价日期和代码。我想编写一个sql查询,它将为用户选择的估价日期之前的所有估价日期提供一个包含以下列的报告

Code | BeginningEquity | Subscriptions | Redemptions | EndingEquity
在哪里

代码是用户选择的代码 BeginingEquity是上一次评估的NetAssetValue 订阅是直截了当的 赎回是直截了当的 EndingEquity是估值日的净资产价值 我首先创建了一个名为@ValDates的表变量,并将所有估价日期都放入这个临时表中。然后我将@ValDates与ValuationHistory表连接起来

但是我在下面的查询中得到一个错误。错误消息是:

子查询返回了多个值

有人能帮我用更好的方式写这个查询吗

SELECT (SELECT NetAssetValue 
        FROM   ValuationHistory 
        WHERE  ValuationDate IN (SELECT Max(ValuationDate) 
                                 FROM   ValuationHistory 
                                 WHERE  ValuationDate < nd.ValuationDate)), 
       Subscriptions, 
       Redemptions, 
       EndingEquity 
FROM   ValuationHistory vh 
       INNER JOIN @ValDates vd 
               ON vh.ValuationDate = vd.ValuationDate 
WHERE  vh.Code = @Code 
       AND vh.ValuationDate < = @ValuationDate 

我不太清楚你的要求。根据描述,您可以尝试按如下方式开始查询

DECLARE @Code VARCHAR(10) = 'ABC'
       ,@ValuationDate date = '2014-07-31'

;WITH cte AS (
  SELECT 
     rn = ROW_NUMBER() OVER (PARTITION BY Code ORDER BY ValuationDate), *
  FROM ValuationHistory
 )
SELECT 
  c1.Code,
  c2.NetAssetValue AS BeginningEquity,
  c2.ValuationDate AS BeginningDate,
  c1.NetAssetValue AS EndingEquity,
  c1.ValuationDate AS EndingDate,
  c1.[Subscriptions], 
  c1.[Redemptions]
from cte c1
LEFT JOIN cte c2 
  ON c1.Code = c2.Code
  AND c2.rn = c1.rn - 1
WHERE  c1.Code = @Code 
AND c1.ValuationDate < = @ValuationDate 

选择NetAssetValue前1名?首先,感谢Tim为我的问题正确设置格式。Top 1修复了我的子查询返回的多个值错误,但现在看来BeginingEquity和EndingEquity具有相同的值示例数据列表的期望输出是什么?谢谢Eric。。。让我试试这个