从当前季度值中减去去年的季度末值

时间:2014-01-21 20:41:31

标签: sql ms-access ms-access-2007

我知道

(DateAdd("s",-1,
DateAdd("q",DateDiff("q","1/1/1900",
DateAdd("yyyy",-1,Date())),"1/1/1900")),
"Short Date") 

返回1年前一个季度的最后一天。

所有NAV_Dates都是每个季度的最后一天,并且具有与它们相关联的值,这使得该行唯一。 (标题为NetAssetValue的结算值)

我如何使用它(或类似的东西)来获取与结束年度季度日期相关的值,并从当前季度的结束值中减去它。注意:我不必使用它,它只是我知道的唯一一个SQL,它会返回一个接近我需要的值。

表的值将设置为类似于:

+----------+--------------+
|NAV_Date  |NetAssetValue |
+----------+--------------+
|12/31/2012|        $4,000|
+----------+--------------+
|03/31/2013|        $5,000|
+----------+--------------+

年初至今将为(5,000 / 4,000) - 1并保存为百分比。另一个例子是:

+----------+--------------+
|NAV_Date  |NetAssetValue |
+----------+--------------+
|12/31/2012|        $4,000|
+----------+--------------+
|06/30/2013|        $4,025|
+----------+--------------+

年初至今计算:(4,025 / 4,000) - 1并保存为百分比。

我知道它涉及嵌套子查询(或可能不止一个),我们基本上必须捕获当前季度的结束,使用该值,并捕获前一年的季度结束并使用该值。只是不太确定该怎么做。

1 个答案:

答案 0 :(得分:2)

考虑到相关的子查询,你在正确的轨道上。我想你希望子查询返回每个季度记录的年终NetAssetValue

我希望此查询中的WHERE子句使逻辑清晰。但是,它会强制子查询对表中的每一行运行Year()函数。即便如此,如果桌子足够小,您可能会对性能感到满意。

SELECT
    y1.NAV_Date,
    y1.NetAssetValue,
    (
        SELECT TOP 1 y2.NetAssetValue
        FROM YourTable AS y2
        WHERE Year(y2.NAV_Date) = Year(y1.NAV_Date)
        ORDER BY y2.NAV_Date DESC
    ) AS YearEndValue
FROM YourTable AS y1;

我认为,假设WHERE被编入索引,以下NAV_Date子句应提供比上述更好的性能。但是,您可能会发现它不太直观。如果是这样,请尝试第一个版本,然后在需要时再使用此版本:

    WHERE y2.NAV_Date <= DateSerial(Year(y1.NAV_Date), 12, 31)

请注意,在当前年份,查询将从NetAssetValue的最新季度记录返回YearEndValue,即使年份尚未结束。我不知道在那种情况下你还想要什么。

最后,查询应该为每个季度提供NetAssetValueYearEndValue。您剩下的就是添加使用这些值的计算。

相关问题