通过单词LIKE(带通配符)进行SQL分组,如何实现正确的求和

时间:2015-04-29 09:27:37

标签: sql ms-access ms-jet-ace

我正在使用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中指定的类别汇总总和,这是一个带有子串的字典:(

Mountain Bike Special, 越野自行车 滑板亲 滑板。

我按降序对表格进行了排序,以便较长的名称显示在较短的名称之前。通过排序预期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“”作为kod, sum(b)As wartosc ,TableB.Descr as opis_grupy

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

WHERE TableA.a IS NOT NULL

GROUP BY TableB.Descr

按顺序排列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życiefunkkc)但我不知道如何实现它,以便查询应按预期求和。谢谢你把我弄出来。

2 个答案:

答案 0 :(得分: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进行汇总。

答案 1 :(得分:0)

谢谢Hanno

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

我的数据:

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 VICRYL

VICRYL bbb VICRYL

VICRYL加AAA VICRYL

VICRYL加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值得更多的信任,我需要更多地测试它。