如何用SQL SELECT语句实现类似Vlookup的零件号提取统计功能?
优化零件标识统计的SQL方案
嘿,作为StackOverflow新手能想到用CASE语句来实现分类统计已经很不错啦!不过你当前的写法如果后续要新增更多零件标识,会让CASE变得越来越冗长,维护起来很麻烦。我给你两个更简洁、易维护的方案,都是只用SELECT语句就能实现的:
方案1:用匹配列表JOIN实现统计(适合无优先级需求)
这个方案把所有需要匹配的标识集中管理,新增/修改标识只需要调整列表部分,而且能完整统计每个标识的使用次数(包括0次的情况):
SELECT m.MatchCode, COUNT(p.Part_No) AS UsageCount FROM (VALUES ('B-123'), ('B-456'), ('IW-10'), ('T-TLT'), ('B-TLT3060') -- 后续新增标识直接在这里加行即可 ) AS m(MatchCode) LEFT JOIN Part p ON p.Part_No LIKE '%' + m.MatchCode + '%' GROUP BY m.MatchCode ORDER BY UsageCount DESC;
注意:如果同一个零件号可能匹配多个标识,这个方案会把它统计到所有匹配的标识下,如果你需要和原来CASE一样的“只匹配第一个符合条件的标识”逻辑,就用下面的方案。
方案2:模拟CASE的优先级匹配(精准还原原逻辑)
这个方案和你原来的CASE语句逻辑完全一致,每个零件号只会被统计到第一个匹配到的优先级最高的标识下,同时也方便维护匹配列表:
SELECT m.MatchCode, COUNT(p.Part_No) AS UsageCount FROM Part p CROSS APPLY ( SELECT TOP 1 MatchCode FROM (VALUES ('B-123'), ('B-456'), ('IW-10'), ('T-TLT'), ('B-TLT3060') ) AS mc(MatchCode) WHERE p.Part_No LIKE '%' + mc.MatchCode + '%' ORDER BY -- 这里的数字对应匹配优先级,越小越先匹配,和你原来CASE的顺序一致 CASE mc.MatchCode WHEN 'B-123' THEN 1 WHEN 'B-456' THEN 2 WHEN 'IW-10' THEN 3 WHEN 'T-TLT' THEN 4 WHEN 'B-TLT3060' THEN 5 ELSE 99 END ) AS m GROUP BY m.MatchCode ORDER BY UsageCount DESC;
这两个方案都比冗长的CASE语句更易读、易维护,你可以根据自己的实际需求选择~
内容的提问来源于stack exchange,提问作者user9569386
相关产品推荐
相关产品推荐

