我的表格包含以下字段:resourceID
,work_date
,stringValue
我正在尝试构建一个Access查询,该查询将显示在给定日期范围内每周发生给定resourceID
的不同stringValue
个数字的计数。但是,当我使用以下查询时,使用partition()
似乎是最简单的方法:
select partition([work_date],#6/6/2011#,#9/4/2011#,7),stringValue,
count(resourceID) from
(select distinct resourceID,work_date,stringValue from myTable) as subQuery
group by partition([work_date],#6/6/2011#,#9/4/2011#,7), stringValue
然后我有两个问题:
- 我的日期最终格式化为整数,例如:
:40699
40700:40706
40784:40790
而我希望它们显示为,例如6/6/2011:6/12/2011
(我也不想要:40699
值)
- resourceID
如果出现在一个以上的工作日,则每周计算一次以上;如果它出现在那一周,我只希望每个stringValue
计算一次。我认为distinct
限定符会完成此操作,但事实并非如此。
编辑:我通过将分区放在子查询中解决了多余的resourceID
计数,如下所示:
select datePartition,stringValue,count(ID)
from (select partition() as datePartition, stringValue, ID
from (select distinct stringvalue,ID,work_date))
group by datePartition,stringvalue
然后从该子查询中提取count(ID)
。但是仍然无法弄清楚日期格式。
答案 0 :(得分:2)
我看到2个解决方案,但我认为没有理由在这里使用Partition()!
解决方案1:使用SELECT Format([DateFact];"ww-yyyy") as weekOfYear
将返回周数和年份:按周分组,显示周数。
解决方案2:使用SELECT [DateFact]-Weekday([datefact]+1) as weekStarting
将返回一周的第一天作为格式良好的日期:按周分组,显示星期开始日。
答案 1 :(得分:1)
要摆脱以40699结尾的范围,请尝试修改子查询部分。添加WHERE条件以将行限制为work_date值> =#6/6/2011#
SELECT DISTINCT resourceID, work_date, stringValue
FROM myTable
WHERE work_date >= #6/6/2011#;
我不清楚您对SELECT DISTINCT中重复行的描述。一种可能性是,至少有一些work_date值包含来自同一日期的不同时间值。因此,两行具有相同的resourceID和stringValue,但work_date值为#6/6/2011 01:00 AM#和#6/6/2011 02:00 AM#,将合法地认定为不同。
如果这不是解释,请通过向我们展示myTable中的一小组数据以及该数据的结果集来阐明您的问题,该数据说明了您希望如何评估数据。
AFAICT,关于分区()的问题将您的日期范围显示为整数是不可避免的。根据帮助主题,Partition()期望其参数的整数。显然,它愿意通过将它们转换为整数来接受您的日期/时间值。但它不愿意/能够将它们转换回日期字符串。你必须自己改变它们。从查询调用时,用户定义的函数可以执行此操作。
Public Function WholeNumRange2Date(ByVal pRange As String)
Const cstrFmt As String = "m/d/yyyy"
Dim varPieces As Variant
varPieces = Split(pRange, ":")
WholeNumRange2Date = Format(CDate(varPieces(0)), cstrFmt) & _
":" & Format(CDate(varPieces(1)), cstrFmt)
End Function
立即窗口中使用该功能的示例......
? WholeNumRange2Date("40700:40706")
6/6/2011:6/12/2011