我正在处理一个包含数据的excel文件和一个使用SQL字符串通过ADO过滤数据的vba。
我的数据库包含: Surname;Start_date (合同的),Dur_mths (合同期限),Value (合同的总价值)。
一份合同可以有2-3年的期限。因此,我想将每个合同的总价值除以持续时间(值/m),检查该合同在特定期间是否有效,然后将每个姓氏的结果相加。每个姓氏在给定的时期内可能有几个有效的合同。我希望看到所有合同价值的总和除以每个姓氏在给定时期的期限。
我当前一个月(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]
现在,我想让它工作一个季度(或一年)。我知道这仍然需要在每个季度检查每个月的合同是否有效。合同开始和合同结束(开始加上持续时间,以月为单位)。
我的问题来了:
有没有一种简单的方法来开发代码来在一个季度(一年,任何时期)做同样的事情?即。检查合同在给定期间(季度、年)内是否有几个月处于有效状态?然后将每个客户的有效合同值(以月为单位的/duration)相加?
非常感谢你的帮助。
Jacek
EDIT!:如果是一个季度,对于一个客户或姓氏,计算应该是:合同在该季度(或年度或指定期间)的第几个月是有效的。
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:
我现在正在考虑如何使用循环来计算在一个季度(或一年,或给定的时间段)中有多少个月的合约是有效的。例如:我正在尝试开发一个循环,就像这样(它实际上不是任何工作代码,而是我认为需要做的想法,不幸的是,我不是一个程序员):
(??? 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。我将使用它在初始代码中乘以我的合同/(以月为单位的持续时间)。我现在正在尝试阅读如何将它合并到我的初始代码中。
发布于 2014-03-31 13:57:40
您可能可以使用带有不同参数的相同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))
MSDN here上提供了DATEADD函数的完整详细信息。
发布于 2014-04-03 09:51:06
就目前而言,我得出了以下解决方案,用于单个季度的-by,简单地重复该月的代码。日期范围和区域是从excel单元格输入到sql字符串中的…我仍然想知道它是否可以在任何时间段内以某种方式通用(使用循环?)此外,我还添加了一个左连接
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]
添加空行只是为了提高可读性。这些字符串首先在excel中连接起来,形成一个在vba宏中执行的SQL查询字符串。我将感谢所有的评论和更正。我的问题还没有解决,是否有可能在EXCEL ADO VBA中循环这样的解决方案。
https://stackoverflow.com/questions/22760398
复制相似问题