繁体   English   中英

计算表中的出现次数

[英]Counting occurrences in a table

假设我要计算一列中的字符串中包含的名称出现的总数,并在该名称旁边所有新出现的名称中显示该总数。 例如,如果我有:

Name  | Home Address | Special ID 
==================================
Frank | 152414       | aTRF342
Jane  | 4342342      | rRFC432
Mary  | 423432       | xTRF353
James | 32111111     | tLZQ399
May   |    4302443   | 3TRF322

我将如何计算特殊标记(例如“ TRF”,“ RFC”或“ LZQ”)的出现,因此表格如下所示:

Name  | Home Address | Special ID  | Occurrences
================================================
Frank | 152414       | aTRF342     |     3
Jane  | 4342342      | rRFC432     |     1
Mary  | 423432       | xTRF353     |     3
James | 32111111     | tLZQ399     |     1
May   |    4302443   | 3TRF322     |     3

当前正在使用Access2007。使用SQL查询甚至有可能吗?

您必须GROUP BY Special ID的子字符串。 在MS Access中,您可以在此处阅读有关如何计算子字符串的信息

您遇到的问题是,“ Special ID列中的数据未遵循一种标准模式,该模式很容易通过substring函数提取。 您可能需要使用正则表达式提取此类值,然后再将GROUP BY应用于它们。

使用MSSQL,Oracle,PostgreSQL,您将能够声明一个存储过程(MS SQL Server中的CLR函数示例 )来为您执行此操作。 不确定使用MS Access。

您可以执行以下操作:

select Name, [Home Address], [Special ID], 
       (select count(*) from [your table] where [Special ID] = RemoveNonAlphaCharacters([Special ID]) ) as Occurrences
from [your table]

辅助功能(从此链接获得 ):

Create Function [dbo].[RemoveNonAlphaCharacters](@Temp VarChar(1000))
Returns VarChar(1000)
AS
Begin

    While PatIndex('%[^a-z]%', @Temp) > 0
        Set @Temp = Stuff(@Temp, PatIndex('%[^a-z]%', @Temp), 1, '')

    Return @Temp
End

假设您的第一个表格称为“ 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)

使用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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM