2

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

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

当前使用 Access 2007。这甚至可以使用 SQL 查询吗?

4

5 回答 5

0

你可以这样做:

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
于 2012-05-09T14:39:21.203 回答
0

假设您的第一个表称为“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
于 2012-05-09T14:47:54.133 回答
0

我建议将其明确地作为一个连接来执行,这样您就可以清楚它是如何工作的:

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)
于 2012-05-09T15:46:50.177 回答
0

使用 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;
于 2012-05-09T16:38:10.197 回答
0

您将不得不GROUP BY使用Special ID. 在 MS Access 中,您可以在此处阅读有关如何计算子字符串的信息。

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

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

于 2012-05-09T14:33:25.170 回答