Sql server 2008 将一个表自身连接起来
我有一个包含以下列的表ValuationHistorySql 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
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。。。让我试试这个