Sql 统计某一特定领域一年内的发病率

Sql 统计某一特定领域一年内的发病率,sql,ms-access,Sql,Ms Access,我在MS Access数据表中存储了类似于FVS101209GO5的字符串,我想计算某一年中字符串的数量,因此在示例中是2010年 我在做什么 query = "SELECT SUM( IIF( Mid( KEYLastName, 4, 2) , 1,0)) AS occur FROM MyTable WHERE Year(mydate)=2010 ;" 对于@JW添加的示例,字符串的长度为12或13 qwe123456XXX - 2012 asd345678XXX

我在MS Access数据表中存储了类似于
FVS101209GO5
的字符串,我想计算某一年中字符串的数量,因此在示例中是2010年

我在做什么

query = "SELECT SUM( IIF( Mid( KEYLastName, 4, 2) , 1,0)) AS occur FROM MyTable WHERE Year(mydate)=2010 ;"
对于@JW添加的示例,字符串的长度为12或13

qwe123456XXX       -  2012
asd345678XXX       -  2034  
FVS101209GO5       -  2010

似乎
KEYLastName
中的第4和第5个字符代表一年中的最后2位数字,因此“FVS11209GO5”是2010年的。如果这是正确的,您可以通过以下两个查询中的任意一个来计算代表2010的
KEYLastName
值的数量:

SELECT Sum(IIf(Mid(KEYLastName, 4, 2) = "10", 1, 0)) AS occur
FROM MyTable;

SELECT Count(IIf(Mid(KEYLastName, 4, 2) = "10", 1, Null)) AS occur
FROM MyTable;
但是,我不确定为什么还有一个
WHERE
子句将行限制为
mydate
从2010年开始的行。如果您也想这样做,请在
mydate
上创建一个索引,并在上面的一个查询中包含这个
WHERE
子句

WHERE mydate >= #2010-1-1# AND mydate < #2011-1-1#
其中mydate>=#2010-1-1#和mydate<#2011-1-1#

使用
mydate
上的索引,该索引应该比要求db引擎将
Year()
函数应用于表中每一行的
mydate
值快得多。

如果希望在字符串中查找不同年份的发生次数,您可能希望使用:

SELECT Mid([KEYLastName],4,2) AS [Year], 
       Count(KEYLastName) AS CountOfOccurances
FROM MyTable
GROUP BY Mid([KEYLastName],4,2)
这将返回(4,2)处的所有两位数年份以及它们各自出现的次数

重新编辑评论

SELECT KEYLastName, 
       Mid([KEYLastName],4,2) AS [Year], 
       DCount("*","MyTable","Mid([KEYLastName],4,2)=" 
          & Mid([KEYLastName],4,2)) AS YearCount
FROM MyTable

你能给出你想要的结果吗?例如,如果你有这样的记录,
qwert123
asd345
fvs11209go5
,那么输出结果会是什么?也许可以使用
分组方式
?这非常有用,有没有办法将KEYLastName本身添加到结果中?因此,生成的表将包含3个字段,KEYLastName、Year和CountOfCurrences?我猜您有许多不同的KEYLastName包含相同的Year字符串,因此您不能简单地在其上添加KEYLastName和Group。我添加了一个可能适合的建议。