我正在寻找一种可以计算出在给定时间内股票价值的方式。
在示例中,我需要计算并报告给定月份的股票赎回。
我需要查看3个表:
兑换表,其中包含兑换日期,已兑换的股份数目以及股份类型。
共享类型表,它具有共享类型并链接第1和第3个表。
股票价格表,其中包含股票类型,估值日期,价值。
所以我需要做的是报告并根据股票赎回的数量计算按月分解的股票价值。
这有意义吗?
提前感谢您的帮助!
道歉,我想我应该进一步阐述,因为可能存在一些误解。这不是计算每日变化的股票和股票,而是更多的资金管理。这意味着股价只会按月变化,而且通常也会落后一个月。这样做的结果是查询需要做的是查看兑换日期,计算出日期,即月份和年份。然后查看股票价格表以及是否有给定日期的股价(这将需要计算,因为它将是一天,即价格是第y天的x),然后乘以该值的单位数量。但是,如果给定日期没有股价,则使用该特定股票类型的最后价格。
希望这可能会更加清晰,但如果我能提供任何其他信息以便更容易,请告诉我,我会向您提供相关信息。
此致
菲尔
答案 0 :(得分:0)
如果您有每天的估值,那么计算是一个简单的连接,后跟一个聚合。生成的查询类似于:
select year(redemptiondate), month(redemptiondate),
sum(r.NumShares*sp.Price) as TotalPrice
from Redemptions r left outer join
ShareType st
on r.sharetype = st.sharetype left outer join
SharePrice sp
on st.sharename = sp.sharename and r.redemptiondate = sp.pricedate
group by year(redemptiondate), month(redemptiondate)
order by 1, 2;
答案 1 :(得分:0)
如果我理解你的问题,你需要一个像
这样的查询select shares.id, shares.name, sum (redemption.quant * shareprices.price)
from shares
inner join redemption on shares.id = redemption.share
inner join shareprices on shares.id = shareprices.share
where redemption.curdate between :p1 and :p2
order by shares.id
group by shares.id, shares.name
:p1和:p2是日期参数
答案 2 :(得分:0)
如果您只需要一个日期范围:
SELECT s.ShareType, SUM(ISNULL(sp.SharePrice, 0) * ISNULL(r.NumRedemptions, 0)) [RedemptionPrice]
FROM dbo.Shares s
LEFT JOIN dbo.Redemptions r
ON r.ShareType = s.ShareType
OUTER APPLY (
SELECT TOP 1 SharePrice
FROM dbo.SharePrice p
WHERE p.ShareType = s.ShareType
AND p.ValuationDate <= r.RedemptionDate
ORDER BY p.ValuationDate DESC) sp
WHERE r.RedemptionDate BETWEEN @Date1 AND @Date2
GROUP BY s.ShareType
其中@ Date1和@ Date2是您的日期
ISNULL
检查就在那里,所以如果某些东西为空(它将为0),它实际上会给你一个值。在这种情况下,它完全是可选的,只是个人偏好。
OUTER APPLY
就像LEFT JOIN
一样,会过滤掉SharePrice的结果,以确保您根据RedemptionDate从表中获取最新的ValuationDate,即使它不是来自同一个日期范围为该日期。它可能是另一种方式,但我觉得这很容易阅读。
如果您对OUTER APPLY感觉不舒服,可以在SELECT部分使用子查询(即ISNULL(r.NumRedemptions, 0) * (/* subquery from dbo.SharePrice here */)
答案 3 :(得分:0)
这应该可以解决问题(注意:更新为按ShareType分组):
SELECT
ST.ShareType,
RedemptionMonth = DateAdd(month, DateDiff(month, 0, R.RedemptionDate), 0),
TotalShareValueRedeemed = Sum(P.SharePrice * R.SharesRedeemed)
FROM
dbo.Redemption R
INNER JOIN dbo.ShareType ST
ON R.ShareTypeID = ST.ShareTypeID
CROSS APPLY (
SELECT TOP 1 P.*
FROM dbo.SharePrice P
WHERE
R.ShareTypeID = P.ShareTypeID
AND R.RedemptionDate >= P.SharePriceDate
ORDER BY P.SharePriceDate DESC
) P
GROUP BY
ShareType,
DateAdd(month, DateDiff(month, 0, R.RedemptionDate), 0)
ORDER BY
ShareType,
RedemptionMonth
;
See it working in a Sql Fiddle
只需在Redemption
表上添加带条件的WHERE子句即可轻松参数化。如果您需要在没有兑换的几个月内为共享类型显示0,请告诉我,我会改进我的答案 - 如果您稍微填写一下您的用例场景并准确描述它会有所帮助您想要输入的内容以及您希望输出的内容。
另请注意:我在这里假设股票赎回总是有价格 - 如果在任何股票价格之前存在赎回,则赎回将被排除。