0

我正在使用 Excel VBA 中的 Access 查询。我的表包含更通用和专业产品的组合,带有字符串的列,例如:

    Mountain bike x2321, 10
    Enduro Mountain bike special y3233, 20 
    Mountain bike a2a321, 10
    Skateboard z23233, 10
    Skateboard y2dsf3, 10
    Skadeboard pro advanced special 20, etc

我想汇总销售值,我想按单独的 TableB 中指定的类别汇总总和,这是一个带有子字符串的字典:(

山地自行车特价,山地自行车滑板专业滑板。

我按降序对表格进行了排序,以便较长的名称出现在较短的名称之前。通过排序,JOIN 将导致 Scateboard pro 在测试 Scateboard 之前将针对任何记录测试是否存在。

我的预期结果是

Mountain bike special   Total 20
Mountain bike           Total  20
Skateboard pro Total  20
Skateboard      Total 20

但是,我的查询总计了所有山地自行车,甚至是特殊的和所有的滑板,甚至是不正确的专业自行车。我希望将它们总结为不同的类别。对我的 TableB 进行降序排序,我的字典没有用。:

Mountain bike special   Total 20
Mountain bike                 Total  40
Skateboard pro Total  20
Skateboard      Total 40

我尝试的查询包括使用 LIKE 和通配符进行搜索,如下所示:

SELECT "" As kod, sum(b) As wartosc , TableB.Descr as opis_grupy

FROM TableA LEFT JOIN TableB ON TableA.Descr LIKE (" "+TableB.Descr+" ")

其中 TableA.a 不为空

GROUP BY TableB.Descr

ORDER BY TableB.Descr DESC

不幸的是,这样的查询不能正确求和。我正在考虑使用 FIRST np. http://www.mrexcel.com/forum/excel-questions/417807-sql-join-question-excel-access-only-return-first-join-instance.html(首先是użycie funkcji)但我不知道如何实现它,以便查询应按预期求和。谢谢你帮助我。

4

2 回答 2

1

您可以尝试使用另一个(子)查询来首先找到最长的匹配类别,例如:

SELECT TableA.descr AS aDescr, TableB.descr AS bDescr
FROM TableA
LEFT JOIN TableB on TableA.descr LIKE "*" + TableB.descr + "*"
GROUP BY TableA.descr, TableB.descr
HAVING len( TableB.descr ) = max( len( TableB.descr ) )

请注意将HAVING结果限制为最长匹配的子句TableB。拥有此数据集后,您可以bDescr在下一步轻松聚合。

于 2015-04-29T09:52:10.987 回答
0

谢谢汉诺

我试图运行您的提案,我觉得它一定是正确的轨道,但它仍然匹配不正确:

我的数据:

ID  a   Descr   b
144 bbdd    VICRYL PLUS bbb 20
142 aacc    VICRYL PLUS aaa 20
10  dd22    VICRYL PLUS AAA     20
143 ggdc    VICRYL bbb  10
11  ss3d    VICRYL  10

试过sql:

SELECT TableA.descr AS aDescr, TableB.descr AS bDescr
FROM TableA
LEFT JOIN TableB on TableA.descr LIKE ("*"+TableB.Descr+"*") 
GROUP BY TableA.Descr, TableB.Descr
HAVING len( TableB.Descr ) = max( len( TableB.Descr ) );

我得到的匹配仍然不正确:aDescr bDescr

维可利 维可利

VICRYL bbb VICRYL

VICRYL PLUS AAA VICRYL

VICRYL PLUS AAA VICRYL PLUS

VICRYL PLUS BBB VICRYL

VICRYL PLUS BBB VICRYL PLUS

编辑:按照 Hanno 的建议,我尝试从 GROUP BYy 中删除 TableB.descr。我承认我在没有完全理解的情况下进行了反复试验。只有当我将 max(TableB.Descr) 移动到 Select 以消除 TableB.Descr 应该在 GROUP BY 中的消息时,它才有效。

由于最终我想总结分组 TableB.Descr 最终似乎有效的是:

SELECT major, sum(b) FROM
  (SELECT  TableA.descr as opis, max(TableB.Descr) AS major, b
   FROM TableB 
   RIGHT JOIN TableA 
   ON  TableA.Descr LIKE ("*"+TableB.Descr+"*") 
   GROUP BY  TableA.descr,b )
GROUP BY major

我还没有标记为答案。Hanno 值得更多的信任,我需要更多地测试它。

于 2015-04-29T11:12:15.857 回答