我知道
(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并保存为百分比。
我知道它涉及嵌套子查询(或可能不止一个),我们基本上必须捕获当前季度的结束,使用该值,并捕获前一年的季度结束并使用该值。只是不太确定该怎么做。
答案 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
,即使年份尚未结束。我不知道在那种情况下你还想要什么。
最后,查询应该为每个季度提供NetAssetValue
和YearEndValue
。您剩下的就是添加使用这些值的计算。