我是VB / SQL的初学者,几个月前才开始学习,但是当我做一些Excel VBA时,我可以理解算法的逻辑。
我实际上是在设计一个数据库,我可以(希望)跟进一年中每个同事的活动。
目标是使(每月)比率=> 计费天数/(计费+非计费-缺席)
上下文: 一个人可以是:内部工作(不收费),或者外部工作(收费),或者在假期(缺席)。
示例: 顾问1:从01/01/2019到01/06/2019进行外部工作, 从02/06/2019到31/12/2019内部工作, 节假日从02/03/2019到15/03/2019
例如,是否可以使用3月的计费比率?
我创建了4个查询(可能太多了?) 3个查询:[顾问ID] [活动] [开始日期] [结束日期] [比率:Datediff(“ d”; [开始日期]; [结束日期])。
对于每个查询:[活动条件]:一个内部工作,一个外部工作,一个不存在。
对于[Beginning_Date]和[End_Date]标准:<= [输入开始日期],> = [输入结束日期]
第4个查询[顾问ID] [可结算] [不计费] [不存在](并计划添加[比率])。
问题是:Datediff会计算发现的整个活动的日期,而不仅仅是我希望的01/03/2019到31/03/2019之间的日期。
我希望比率的输出为:所需时间的计费天数/(计费+非计费-缺席)。
实际输出显示输入日期之间的整个期间的可计费,不可计费和缺席天
因此代替了31个计费对象,0个非计费对象,15个缺席 它显示180个可计费,0个非可计费,32个不存在
很抱歉,很长的帖子,这实际上是我的第一篇,非常感谢! 我整整一个星期都在为此苦苦挣扎
答案 0 :(得分:0)
我们首先需要找出每一行的maxBegin和minEnd日期
SELECT
*,
(IIF (Beginning_Date > #3/1/2019#, Beginning_Date, #3/1/2019#) ) as maxBegin,
(IIF (End_Date < #3/31/2019#, End_Date, #3/31/2019#) ) as minEnd,
Datediff("d", maxBegin, minEnd) + 1 as theDiff
FROM Planning
Where Beginning_Date <= #3/31/2019# AND End_Date >= #3/1/2019#
然后使用它来计算持续时间。注意:DateDiff不计两端,因此我们需要添加+1。
SELECT
Consultant_ID,
SUM(IIF (Activity = "Working Internally", Datediff("d", maxBegin, minEnd) +1, 0) ) as NonBillable,
SUM(IIF (Activity = "Working Externally", Datediff("d", maxBegin, minEnd) +1, 0) ) as Billable,
SUM(IIF (Activity = "Holidays", Datediff("d", maxBegin, minEnd) +1, 0) ) as Absent
FROM
(
SELECT
*,
(IIF (Beginning_Date > #3/1/2019#, Beginning_Date, #3/1/2019#) ) as maxBegin,
(IIF (End_Date < #3/31/2019#, End_Date, #3/31/2019#) ) as minEnd
FROM Planning
Where Beginning_Date <= #3/31/2019# AND End_Date >= #3/1/2019#
) as z
GROUP BY Planning.Consultant_ID;
最后,您需要通过参数将实际的开始/结束日期替换为sql以运行查询。另外请注意,假期只有14个,而不是15个。
此外,您可以直接在此sql中添加“比率”计算,并且只有一个查询。