首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >SQL检查合同在本季度(年)的每个月是否处于活动状态。Sum values/(持续时间,单位:月)

SQL检查合同在本季度(年)的每个月是否处于活动状态。Sum values/(持续时间,单位:月)
EN

Stack Overflow用户
提问于 2014-03-31 19:28:20
回答 2查看 798关注 0票数 1

我正在处理一个包含数据的excel文件和一个使用SQL字符串通过ADO过滤数据的vba。

我的数据库包含: Surname;Start_date (合同的),Dur_mths (合同期限),Value (合同的总价值)。

一份合同可以有2-3年的期限。因此,我想将每个合同的总价值除以持续时间(值/m),检查该合同在特定期间是否有效,然后将每个姓氏的结果相加。每个姓氏在给定的时期内可能有几个有效的合同。我希望看到所有合同价值的总和除以每个姓氏在给定时期的期限。

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

代码语言:javascript
代码运行次数:0
运行
复制
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!:如果是一个季度,对于一个客户或姓氏,计算应该是:合同在该季度(或年度或指定期间)的第几个月是有效的。

代码语言:javascript
代码运行次数:0
运行
复制
            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:

我现在正在考虑如何使用循环来计算在一个季度(或一年,或给定的时间段)中有多少个月的合约是有效的。例如:我正在尝试开发一个循环,就像这样(它实际上不是任何工作代码,而是我认为需要做的想法,不幸的是,我不是一个程序员):

代码语言:javascript
代码运行次数:0
运行
复制
(??? 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。我将使用它在初始代码中乘以我的合同/(以月为单位的持续时间)。我现在正在尝试阅读如何将它合并到我的初始代码中。

EN

回答 2

Stack Overflow用户

发布于 2014-03-31 21:57:40

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

代码语言:javascript
代码运行次数:0
运行
复制
AND DateAdd ("q",[Dur_quarter], [Start_date]) >= DateSerial(2012,1+1, 0),[Value]/[Dur_quarter],0)) 

代码语言:javascript
代码运行次数:0
运行
复制
AND DateAdd ("yyyy",[Dur_year], [Start_date]) >= DateSerial(2012,1+1, 0),[Value]/[Dur_year],0)) 

MSDN here上提供了DATEADD函数的完整详细信息。

票数 0
EN

Stack Overflow用户

发布于 2014-04-03 17:51:06

就目前而言,我得出了以下解决方案,用于单个季度的-by,简单地重复该月的代码。日期范围和区域是从excel单元格输入到sql字符串中的…我仍然想知道它是否可以在任何时间段内以某种方式通用(使用循环?)此外,我还添加了一个左连接

代码语言:javascript
代码运行次数:0
运行
复制
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中循环这样的解决方案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22760398

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档