Sql 计算表中的出现次数
假设我要计算列中字符串中包含的名称的出现总数,并在该名称旁边的新列中该名称的所有出现次数旁边显示该总数。例如,如果我有:Sql 计算表中的出现次数,sql,ms-access,vba,ms-access-2007,Sql,Ms Access,Vba,Ms Access 2007,假设我要计算列中字符串中包含的名称的出现总数,并在该名称旁边的新列中该名称的所有出现次数旁边显示该总数。例如,如果我有: Name |家庭住址|特殊ID ================================== 弗兰克| 152414 | aTRF342 简| 4342342 | rRFC432 玛丽| 423432 | xTRF353 詹姆斯| 32111111 | tLZQ399 五月三日 我如何计算特殊标记(如“TRF”、“RFC”或“LZQ”)的出现次数,因此该表如下所示:
Name |家庭住址|特殊ID
==================================
弗兰克| 152414 | aTRF342
简| 4342342 | rRFC432
玛丽| 423432 | xTRF353
詹姆斯| 32111111 | tLZQ399
五月三日
我如何计算特殊标记(如“TRF”、“RFC”或“LZQ”)的出现次数,因此该表如下所示:
select Name, [Home Address], [Special ID],
(select count(*) from [your table] where [Special ID] = RemoveNonAlphaCharacters([Special ID]) ) as Occurrences
from [your table]
Name |家庭地址|特殊ID |事件
================================================
弗兰克| 152414 | aTRF342 | 3
简| 4342342 | rRFC432 | 1
玛丽| 423432 | xTRF353 | 3
詹姆斯| 32111111 | tLZQ399 | 1
五月三日
目前正在使用Access 2007。甚至可以使用SQL查询实现这一点吗?您必须通过
特殊ID的子字符串对进行分组。在MS Access中,您可以阅读有关如何计算子字符串的内容
您案例中的问题是特殊ID
列中的数据没有遵循标准模式,该模式很容易通过子字符串
函数提取。您可能需要使用来提取这些值,然后将groupby
应用于这些值
使用MSSQL、Oracle、PostgreSQL,您将能够声明一个存储过程(在MS SQL Server中)来为您执行此操作。使用MS Access不确定。您必须通过特殊ID的子字符串对进行分组。在MS Access中,您可以阅读有关如何计算子字符串的内容
您案例中的问题是特殊ID
列中的数据没有遵循标准模式,该模式很容易通过子字符串
函数提取。您可能需要使用来提取这些值,然后将groupby
应用于这些值
使用MSSQL、Oracle、PostgreSQL,您将能够声明一个存储过程(在MS SQL Server中)来为您执行此操作。使用MS Access不确定。您可以执行以下操作:
select Name, [Home Address], [Special ID],
(select count(*) from [your table] where [Special ID] = RemoveNonAlphaCharacters([Special ID]) ) as Occurrences
from [your table]
辅助功能(由此获得):
您可以这样做:
select Name, [Home Address], [Special ID],
(select count(*) from [your table] where [Special ID] = RemoveNonAlphaCharacters([Special ID]) ) as Occurrences
from [your table]
辅助功能(由此获得):
假设您的第一个表名为“table_with_string”
下面的代码将根据特殊ID列中字符串的前3个字符显示发生情况。因为不清楚您是如何传递字符串以进行匹配的
select tws.Name,tws.HomeAddress,tws.SpecialID,str_count.Occurrences from
table_with_string tws
left join
(select SpecialID,count(*) from table_with_string where specialID like(substring
(specialid,0,3))
group by specialId) as str_count(id,Occurrences)
on str_count.id=tws.SpecialID
假设您的第一个表名为“table_with_string”
下面的代码将根据特殊ID列中字符串的前3个字符显示发生情况。因为不清楚您是如何传递字符串以进行匹配的
select tws.Name,tws.HomeAddress,tws.SpecialID,str_count.Occurrences from
table_with_string tws
left join
(select SpecialID,count(*) from table_with_string where specialID like(substring
(specialid,0,3))
group by specialId) as str_count(id,Occurrences)
on str_count.id=tws.SpecialID
我建议您明确地将其作为一个连接来执行,这样您就可以清楚地了解它是如何工作的:
select tws.Name, tws.HomeAddress, tws.SpecialID, str_count.Occurrences
from table_with_string tws
join
(
select substring(spcecialid, 2, 3) as code, count(*) as Occurrences
from table_with_string tws
group by substring(spcecialid, 2, 3)
) s
on s.code = substring(tws.spcecialid, 2, 3)
我建议您明确地将其作为一个连接来执行,这样您就可以清楚地了解它是如何工作的:
select tws.Name, tws.HomeAddress, tws.SpecialID, str_count.Occurrences
from table_with_string tws
join
(
select substring(spcecialid, 2, 3) as code, count(*) as Occurrences
from table_with_string tws
group by substring(spcecialid, 2, 3)
) s
on s.code = substring(tws.spcecialid, 2, 3)
使用Access 2007,我将您的示例数据存储在名为tblUser1384831的表中。下面的查询返回此结果集
Name Home Address Special ID special_tag Occurrences
---- ------------ ---------- ----------- -----------
Frank 152414 aTRF342 TRF 3
Jane 4342342 rRFC432 RFC 1
Mary 423432 xTRF353 TRF 3
James 32111111 tLZQ399 LZQ 1
May 4302443 3TRF322 TRF 3
尽管您的问题带有vba标记,但您不需要为此使用vba过程。您可以使用SQL和Mid()
函数来实现这一点
SELECT
base.[Name],
base.[Home Address],
base.[Special ID],
base.special_tag,
tag_count.Occurrences
FROM
(
SELECT
[Name],
[Home Address],
[Special ID],
Mid([Special ID],2,3) AS special_tag
FROM tblUser1384831
) AS base
INNER JOIN
(
SELECT
Mid([Special ID],2,3) AS special_tag,
Count(*) AS Occurrences
FROM tblUser1384831
GROUP BY Mid([Special ID],2,3)
) AS tag_count
ON base.special_tag = tag_count.special_tag;
使用Access 2007,我将您的示例数据存储在名为tblUser1384831的表中。下面的查询返回此结果集
Name Home Address Special ID special_tag Occurrences
---- ------------ ---------- ----------- -----------
Frank 152414 aTRF342 TRF 3
Jane 4342342 rRFC432 RFC 1
Mary 423432 xTRF353 TRF 3
James 32111111 tLZQ399 LZQ 1
May 4302443 3TRF322 TRF 3
尽管您的问题带有vba标记,但您不需要为此使用vba过程。您可以使用SQL和Mid()
函数来实现这一点
SELECT
base.[Name],
base.[Home Address],
base.[Special ID],
base.special_tag,
tag_count.Occurrences
FROM
(
SELECT
[Name],
[Home Address],
[Special ID],
Mid([Special ID],2,3) AS special_tag
FROM tblUser1384831
) AS base
INNER JOIN
(
SELECT
Mid([Special ID],2,3) AS special_tag,
Count(*) AS Occurrences
FROM tblUser1384831
GROUP BY Mid([Special ID],2,3)
) AS tag_count
ON base.special_tag = tag_count.special_tag;
您如何知道给定行的代码是什么?在第一个示例中,它是前3个字符。最后一个字符是最后三个字符。编辑以使特殊标记显示在第一个字符之后的同一位置。所以我可以像Josvic建议的那样使用substr,你怎么知道给定行的代码是什么?在第一个示例中,它是前3个字符。最后一个字符是最后三个字符。编辑以使特殊标记显示在第一个字符之后的同一位置。所以我可以像Josvic建议的那样使用substr