SQL按LIKE(带通配符)进行分组,如何实现正确的求和
Posted
技术标签:
【中文标题】SQL按LIKE(带通配符)进行分组,如何实现正确的求和【英文标题】:SQL grouping by words LIKE (with wildcards), how to achieve correct sum 【发布时间】:2015-04-29 09:27:37 【问题描述】:我正在使用 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)但我不知道如何实现它,以便查询应按预期求和。谢谢你帮助我。
【问题讨论】:
请注意order by
对join
的结果没有任何影响。
【参考方案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
轻松聚合。
【讨论】:
MS Access 不理解“%”通配符。它使用 * 好在我们现在有了标准。 - 感谢您的提示! 谢谢汉诺。我了解通配符的区别并尝试针对我的数据运行它。【参考方案2】:谢谢汉诺
我尝试运行您的提案,我认为它一定是正确的轨道,但仍然匹配不正确:
我的数据:
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 值得更多的信任,我需要更多地测试它。
【讨论】:
这应该是对您问题的修改。如果您已经解决了您的问题,您可以将其发布为答案,但更多信息/其他问题应该在问题本身中。 对不起,我的错误。只用GROUP BY TableA.Descr
试试。以上是关于SQL按LIKE(带通配符)进行分组,如何实现正确的求和的主要内容,如果未能解决你的问题,请参考以下文章
SQL C# 使用 LIKE 和通配符生成 SQL 语句;在“bla”附近给出不正确的语法