SQL用于计算特定时间的股票价值

时间:2013-04-08 12:34:47

标签: sql sql-server sql-server-2008 tsql reporting-services

我正在寻找一种可以计算出在给定时间内股票价值的方式。

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

我需要查看3个表:

  1. 兑换表,其中包含兑换日期,已兑换的股份数目以及股份类型。

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

  3. 股票价格表,其中包含股票类型,估值日期,价值。

  4. 所以我需要做的是报告并根据股票赎回的数量计算按月分解的股票价值。

    这有意义吗?

    提前感谢您的帮助!

    道歉,我想我应该进一步阐述,因为可能存在一些误解。这不是计算每日变化的股票和股票,而是更多的资金管理。这意味着股价只会按月变化,而且通常也会落后一个月。

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

    希望这可能会更加清晰,但如果我能提供任何其他信息以便更容易,请告诉我,我会向您提供相关信息。

    此致

    菲尔

4 个答案:

答案 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,请告诉我,我会改进我的答案 - 如果您稍微填写一下您的用例场景并准确描述它会有所帮助您想要输入的内容以及您希望输出的内容。

另请注意:我在这里假设股票赎回总是有价格 - 如果在任何股票价格之前存在赎回,则赎回将被排除。