1

我有下表

col1  col2  col3  col4
====  ====  ====  ====
1233  4566  ABCD  CDEF 
1233  4566  ACD1  CDEF
1233  4566  D1AF  CDEF

我需要计算 col3 中的字符,因此从上表中的数据来看,它将是:

char  count
====  =====
A         3
B         1
C         2
D         3
F         1
1         2

这可以通过仅使用 SQL 来实现吗?

目前我正在考虑将一个参数传递给 SQL 查询并一个一个地计算字符然后求和,但是我还没有开始 VBA 部分,坦率地说,我不想这样做。

这是我目前的查询:

PARAMETERS X Long;
SELECT First(Mid(TABLE.col3,X,1)) AS [col3 Field], Count(Mid(TABLE.col3,X,1)) AS Dcount
FROM TEST
GROUP BY Mid(TABLE.col3,X,1)
HAVING (((Count(Mid([TABLE].[col3],[X],1)))>=1));

非常感谢您的想法和帮助,因为我通常不使用 Access 和 SQL。

4

4 回答 4

1

您可以使用 Numbers 表在纯 Access SQL 中完成任务。在这种情况下,数字表必须包含从 1 到大于源数据中最长字符串的某个数字的整数值。在这个例子中,要处理的字符串在[CharacterData]中:

CharacterList
-------------
GORD         
WAS          
HERE         

而 [Numbers] 表很简单

 n
--
 1
 2
 3
 4
 5

如果我们使用交叉连接来提取字符(消除任何因n超出而导致的空字符串Len(CharacterList))......

SELECT 
    Mid(cd.CharacterList, nb.n, 1) AS c 
FROM 
    CharacterData cd, 
    Numbers nb
WHERE Mid(cd.CharacterList, nb.n, 1) <> ""

...我们得到...

c
--
G
W
H
O
A
E
R
S
R
D
E

现在我们可以将它包装在一个聚合查询中

SELECT c AS Character, COUNT(*) AS CountOfCharacter
FROM
    (
        SELECT 
            Mid(cd.CharacterList, nb.n, 1) AS c 
        FROM 
            CharacterData cd, 
            Numbers nb
        WHERE Mid(cd.CharacterList, nb.n, 1) <> ""
    )
GROUP BY c

这给了我们

Character  CountOfCharacter
---------  ----------------
A                         1
D                         1
E                         2
G                         1
H                         1
O                         1
R                         2
S                         1
W                         1
于 2013-11-10T09:27:54.970 回答
0

知道colum3的固定长度为4,这个问题就很简单了。

假设有一个视图 V,它有四列,每列代表第 3 列中的一个字符。

V(c1, c2, c3, c4)

不幸的是,我不熟悉特定于 Access 的 SQL,但这是您需要的一般 SQL 语句:

SELECT c, COUNT(*) FROM
(
SELECT c1 AS c FROM V
UNION ALL
SELECT c2 FROM V
UNION ALL
SELECT c3 FROM V
UNION ALL
SELECT c4 FROM V
)
GROUP BY c
于 2013-11-10T04:19:47.747 回答
0

很遗憾您不想考虑使用 VBA;你并不需要你想象的那么多:

Public charCounts As Dictionary

Sub LoadCounts(s As String)
    If charCounts Is Nothing Then Init
    Dim length As Integer, i As Variant
    length = Len(s)
    For i = 1 To length
        Dim currentChar As String
        currentChar = Mid(s, i, 1)
        If Not charCounts.Exists(currentChar) Then charCounts(currentChar) = 0
        charCounts(currentChar) = charCounts(currentChar) + 1
    Next
End Sub

Sub Init()
    Set charCounts = New Scripting.Dictionary
    charCounts.CompareMode = TextCompare 'for case-insensitive comparisons; otherwise use BinaryCompare
End Sub

然后,您执行一次查询:

SELECT LoadCount(col3)
FROM Table1

最后,您读出 Dictionary 中的值:

Dim key As Variant
For Each key In charCounts
    Debug.Print key, charCounts(key)
Next

请注意,在查询执行之间,您必须调用Init以清除旧值。

于 2016-03-03T08:21:23.453 回答
-1

请试试这个,,,我希望这会奏效

with cte  as
(
    select row_number() over(order by (select null)) as i from Charactor_Count
)

 select substring( name, i, 1 ) as char, count(*) as count
      from Charactor_Count, cte
     where cte.i <= len(Charactor_Count.name)
     group by substring(name,i,1)
     order by substring(name,i,1)
于 2013-11-10T08:01:40.600 回答