2012-05-09 173 views
2

假設我想計算某個列中某個字符串中包含的名稱的出現總次數,並將該名稱的所有出現次數顯示在其旁邊的新列中。舉例來說,如果我有:計算表中的出現次數

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

我怎麼會指望像「成績單」,「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查詢嗎?謝謝

+0

您如何知道給定行的代碼是什麼?在第一個例子中,它是前3個字符。最後,它是最後三個字符。編輯 –

+0

以使特殊標籤出現在第一個字符之後的相同位置。所以我可以像Josvic所建議的那樣使用substr – user1384831

回答

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; 
0

你將不得不GROUP BY的子串Special ID。在MS Access中,您可以閱讀如何計算子字符here

你的情況的問題是,你的數據在Special ID列不符合標準模式,通過substring函數很容易提取。您可能需要使用regular expressions來提取這些值,並稍後將GROUP BY應用於它們。

使用MSSQL,Oracle和PostgreSQL,您將能夠聲明一個存儲過程(MS SQL Server中的example CLR function),它將爲您執行此操作。不確定與MS Access。

0

你可以做這樣的事情:

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

附配的功能(從這個link了):

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 
0

可以說,你的第一個表被稱爲 'table_with_string'

以下代碼將顯示基於Special ID列中字符串的前三個字符的發生。因爲目前尚不清楚究竟要傳遞的字符串匹配

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 
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)