SQL检查季度(年)每个月的合约是否活跃。 总和值/(以m为单位的持续时间)

我正在使用包含数据和VBA的Excel文件,通过ADO使用SQLstring过滤数据。

我的数据库包含:姓氏; 开始date(合同),Dur_mths(以月为单位的合同期限),价值(合同的总价值)。

合同可能有2-3年的时间。 因此,我想用持续时间(价值/米)来划分每个合约的总价值,检查合约在特定期间是否活跃,然后将每个姓氏的结果相加。 每个姓氏在一定时期内可能有多个合同活动。 我希望看到所有合同价值的总和除以给定期间每个姓氏的持续时间。

我目前的工作代码为一个月(2012年1月),如下所示:

SELECT [Surname], Sum (iif([Start_date] <= '2012-1-1' AND DateAdd ("m",[Dur_mths], [Start_date]) >= DateSerial(2012,1+1, 0),[Value]/[Dur_mths],0)) AS [SumValue] FROM [Data$] GROUP BY [Surname] 

现在,我想使它工作四分之一(或一年)。 我知道这还需要检查一个季度的每个月,如果合同是活跃的。 合同开始和合同结束(开始加上几个月)。

这里是我的问题:

是否有一个简单的方法来开发代码来做同样的一个季度(一年,任何时期)? IE浏览器。 检查合同是否在特定时期(季度,年份)的几个月内有效? 然后将每个客户的活跃合约的价值(/月)

非常感谢你的帮助。

亚采

编辑! :对于一个季度,对于一个客户或姓氏,计算应该testing:在季度(或者在一年中,或者在特定的时间段内)多less个月内,合同是活跃的。

  m1 m2 m3 contr1 50 50 0 (contract ended in m2) contr2 0 0 20 (contract starts in m3) contr3 10 10 10 (contract started 1y ego and will continue well into 2015) etc. 

对于这个姓氏,本季的总和应该是150。

EDIT2:

我正在考虑如何使用一个循环来计算合约活跃的一个季度(或一年或一段时期)中有多less个月。 例如。 我试图开发一个循环,像(这不是实际的任何工作代码,而是一个想法,我认为需要做的,我不是一个程序员不幸):

 (??? i do not know what to do with it yet...) DECLARE @I INT, @N INT; DECLARE @StartDate DATETIME @EndDate DATETIME SET @I = 1 SET @N = 0 SET @QueryStartDate = 2012-01-01 SET @EndDate = DateAdd ("m",[Dur_mths], [Start_date]) WHILE @I <= 3 BEGIN SET @N = @N + iif(DateSerial(year[Start_date];month[Start_date]+@I-1;1); <= @QueryStartDate AND @EndDate >= DateSerial(year(@StartDate),month(@StartDate+@I, 0),1,0)) SET @I = @I + 1 END (??? i do not know what to do with it yet...) 

它会返回合约活动的月数 – @N。 我会用它在最初的代码中增加我的合同/(几个月的时间)。 我正在尝试阅读如何将它合并到我的初始代码中。

也许可以使用具有不同参数的相同DateAdd函数来获取一个季度或一年的数据,如下所示:

 AND DateAdd ("q",[Dur_quarter], [Start_date]) >= DateSerial(2012,1+1, 0),[Value]/[Dur_quarter],0)) 

 AND DateAdd ("yyyy",[Dur_year], [Start_date]) >= DateSerial(2012,1+1, 0),[Value]/[Dur_year],0)) 

DATEADD函数的完整细节在MSDN 这里提供。

就目前而言,我是通过简单地重复本月份的代码来获得单个季度的以下解决scheme。 date范围和地区是从Excel单元格input到SQLstring…我仍然想知道如果它可以做任何时期通用的任何时期(循环?)另外,我添加了一个左连接

 SELECT [Data$].[Surname],[DataInternal$].[Code], [reg], Sum (iif([Start_date] <= '2012-1-1' AND DateAdd ("m",[Dur_mths], [Start_date]) >= DateSerial(2012,1+1, 0) ,[Value]/[Dur_mths],0)) AS [M1], Sum (iif([Start_date] <= '2012-2-1' AND DateAdd ("m",[Dur_mths], [Start_date]) >= DateSerial(2012,1+2, 0) ,[Value]/[Dur_mths],0)) AS [M2], Sum (iif([Start_date] <= '2012-3-1' AND DateAdd ("m",[Dur_mths], [Start_date]) >= DateSerial(2012,1+3, 0) ,[Value]/[Dur_mths],0)) AS [M3], ([M1]+[M2]+[M3]) AS [Q] FROM [Data$] LEFT JOIN [DataInternal$] ON [Data$].[Surname] = [DataInternal$].[Surname] WHERE 1 = 1 AND [reg] = 'N' GROUP BY [Data$].[Surname],[Code],[reg] ORDER BY [Data$].[Surname] 

为了便于阅读,添加了空行。 这些string首先在excel中连接起来,形成一个在vbamacros中执行的SQL查询string。 我将很感激所有的评论和更正。 我的问题仍然没有得到解决,如果有可能在EXCEL ADO VBA中循环这样的解决scheme。