0

我正在寻找一种方法来计算给定时间股票的价值。

在示例中,我需要计算和报告给定月份的股票赎回情况。

我需要查看 3 个表:

  1. 包含赎回日期、赎回股份数量和股份类型的赎回表。

  2. 具有共享类型并链接第 1 和第 3 表的共享类型表。

  3. 具有股票类型、估值日期、价值的股票价格表。

所以我需要做的是报告并根据股票赎回的数量计算出这些股票按月细分的价值。

那有意义吗?

在此先感谢您的帮助!

抱歉,我想我应该进一步详细说明,因为可能存在一些误解。这不是计算每日变化的股票和股票,更多的是为了基金管理。这意味着股价仅按月变动,而且通常也落后一个月。

这样做的效果是查询需要做的是查看赎回日期,计算出日期,即月份和年份。然后查看股价表,如果有给定日期的股价(这将需要计算,因为它将是一天,即价格是第 y 天的 x),然后将它们的单位数乘以这个值。但是,如果在给定日期没有股票价格,则使用该特定股票类型的最后价格。

希望这可能会更清楚一点,但如果我可以提供任何其他信息以使这更容易,那么请告诉我,我会为您提供信息。

问候,

菲尔

4

4 回答 4

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;
于 2013-04-08T12:40:26.613 回答
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 是日期参数

于 2013-04-08T12:41:42.187 回答
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类似 a的行为LEFT JOIN将过滤来自 SharePrice 的结果,以确保您从基于 RedemptionDate 的表中获取最新的 ValuationDate,即使它与该日期不在同一日期范围内。它可能可以通过另一种方式实现,但我觉得这很容易阅读。

如果您对 OUTER APPLY 不满意,您可以在 SELECT 部分使用子查询(即,ISNULL(r.NumRedemptions, 0) * (/* subquery from dbo.SharePrice here */)

于 2013-04-08T13:09:06.697 回答
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
;

看到它在 Sql Fiddle 中工作

Redemption这可以通过简单地在表上添加带有条件的 WHERE 子句来轻松参数化。如果您需要在没有赎回的月份为共享类型显示 0,请告诉我,我会改进我的答案——如果您稍微填写一下您的用例场景并准确描述,这会有所帮助你想输入什么,你想看到什么作为输出。

另请注意:我在这里假设股票赎回总会有一个价格——如果赎回存在于任何股价之前,则该赎回将被排除在外。

于 2013-04-08T17:19:34.753 回答