我是VB / SQL的初学者,几个月前我刚开始学习,但我可以理解算法的逻辑,因为我曾经做过一些Excel VBA。
我实际上正在设计一个数据库,我可以(希望)跟进每年同事的活动。
目标是(每月)比率=>可计费天数/(可结算+非可结算 - 缺席)
背景:一个人可以是:内部工作(不可计费),或外部工作(可计费),或假期(缺席)。
示例:顾问1:从01/01/2019到01/06/2019外部工作,从19/06/2019到201/12/2019内部工作,假期从02/03/2019到15/03/2019
有没有办法让3月的Billable比率为例?
我创建了4个查询(可能太多了?)3个查询:[Consultant_ID] [Activity] [Beginning_Date] [End_Date] [比率:Datediff(“d”; [Beginning_Date]; [End_Date])。
对于每个查询:[活动标准]:一个在内部工作,一个在外部工作,一个在缺席。
对于[Beginning_Date]和[End_Date]标准:<= [输入开始日期],> = [输入结束日期]
第4个查询[Consultant ID] [Billable] [Non billable] [Absent](并计划添加[RATIO])。
问题是:Datediff计算它发现的整个活动的日期,而不仅仅是我希望的01/03/2019和31/03/2019之间的日期。
我预计比率的输出为:可计算期间的可计费天数/(可计费+不可计费 - 缺席)。
实际输出显示输入日期之间整个期间的可计费,不可计费和缺席天数
因此,而不是31 Billable,0 Non billable,15 Absent It显示180 Billable,0 Non Billable,32 Absent
对不起,很长的帖子,实际上是我的第一个,非常感谢你!我整整一周都在苦苦挣扎
我们首先需要弄清楚每行的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;
最后,您需要通过params将实际的Begin / End日期替换为sql来运行查询。另请注意,假期只有14,而不是15。
此外,您可以将比率计算权限添加到此sql中,并且只有一个查询。