我有一个表(Service_records),其中包含以下字段;
客户ID
年
季度(Q1,Q2,Q3,Q4)
服务
费用
还有一张表(Customer_records),其中包含客户的个人详细信息,例如: name和DoB按客户ID链接到后续查询中的上表。
我还有一张包含财务年度清单(Financial_years)的表格,例如
十六分之二千零一十五
2016/17
2017/18
我创建了一个简单的表单,其中包含一个显示财务年度的组合框,然后是一个用于打开查询的按钮。
查询当前是包含所有上述表格的CrossTab查询,它将服务显示为行,将季度显示为列
------------- Q1 Q2 ---- --- --- Q3 Q4
服务1 |
客服2 |
服务3 |
我想做的是计算所选年份在该季度(本季度第一天为30天)30-35岁的客户ID数量,我们的季度运行时间为Q1-Apr-June,Q2-July-Sep,Q3-Sep-Dec,Q4 Jan-Mar。
可以这样做吗?
答案 0 :(得分:1)
首先需要一个函数来正确计算全年的年龄:
Public Function Years( _
ByVal datDate1 As Date, _
ByVal datDate2 As Date, _
Optional ByVal booLinear As Boolean) _
As Integer
' Returns the difference in full years between datDate1 and datDate2.
'
' Calculates correctly for:
' negative differences
' leap years
' dates of 29. February
' date/time values with embedded time values
' negative date/time values (prior to 1899-12-29)
'
' Optionally returns negative counts rounded down to provide a
' linear sequence of year counts.
' For a given datDate1, if datDate2 is decreased step wise one year from
' returning a positive count to returning a negative count, one or two
' occurrences of count zero will be returned.
' If booLinear is False, the sequence will be:
' 3, 2, 1, 0, 0, -1, -2
' If booLinear is True, the sequence will be:
' 3, 2, 1, 0, -1, -2, -3
'
' If booLinear is False, reversing datDate1 and datDate2 will return
' results of same absolute Value, only the sign will change.
' This behaviour mimics that of Fix().
' If booLinear is True, reversing datDate1 and datDate2 will return
' results where the negative count is offset by -1.
' This behaviour mimics that of Int().
' DateAdd() is used for check for month end of February as it correctly
' returns Feb. 28. when adding a count of years to dates of Feb. 29.
' when the resulting year is a common year.
'
' 2007-11-13. Cactus Data ApS, CPH.
Dim intDiff As Integer
Dim intSign As Integer
Dim intYears As Integer
' Find difference in calendar years.
intYears = DateDiff("yyyy", datDate1, datDate2)
' For positive resp. negative intervals, check if the second date
' falls before, on, or after the crossing date for a full 12 months period
' while at the same time correcting for February 29. of leap years.
If DateDiff("d", datDate1, datDate2) > 0 Then
intSign = Sgn(DateDiff("d", DateAdd("yyyy", intYears, datDate1), datDate2))
intDiff = Abs(intSign < 0)
Else
intSign = Sgn(DateDiff("d", DateAdd("yyyy", -intYears, datDate2), datDate1))
If intSign <> 0 Then
' Offset negative count of years to continuous sequence if requested.
intDiff = Abs(booLinear)
End If
intDiff = intDiff - Abs(intSign < 0)
End If
' Return count of years as count of full 12 months periods.
Years = intYears - intDiff
End Function
然后创建一个函数来计算季度的开始日期,例如:
Public Function CalendarQuarterStart( _
ByVal FinancialYear As String, _
ByVal FinancialQuarter As String) _
As Date
Dim CalendarYear As Integer
Dim CalendarMonth As Integer
Dim DateStart As Date
CalendarYear = Val(FinancialYear) ' "2015/16"
CalendarMonth = 1 + 3 * Right(FinancialQuarter, 1) ' "Q3"
DateStart = DateSerial(CalendarYear, CalendarMonth, 1)
CalendarQuarterStart = DateStart
End Function
因此,在您的查询中:
Age: Years([DateOfBirth], CalendarQuarterStart([FinancialYear],[FinancialQuarter]))