MySQL查询简化:分组后按类别排除指定商品编码统计交易数
简化MySQL查询:按分类排除指定编码后统计交易数
嘿,我来帮你搞定这个MySQL查询的简化问题!这里有两种实用的写法,既能满足按分类排除指定item_code的需求,又能清晰统计各分类的有效交易数:
方式一:直接在WHERE子句中定义排除规则(适合规则固定场景)
这种写法逻辑直观,把各分类的排除规则直接写在过滤条件里,代码简洁易懂:
SELECT Category, COUNT(*) AS `Total Transactions` FROM your_transaction_table WHERE (Category = 'A' AND item_code NOT IN (1, 3)) OR (Category = 'B' AND item_code NOT IN (2, 3, 5)) OR (Category = 'C' AND item_code NOT IN (4, 5)) GROUP BY Category;
如果你的交易表上有(Category, item_code)的联合索引,这个查询的性能会非常出色,数据库能快速过滤掉不符合条件的记录。
方式二:用临时规则表关联查询(适合规则易变动场景)
如果后续可能需要修改排除规则或者新增分类,这种方式的可维护性更强——你只需要调整规则表的内容,不用动主查询逻辑:
WITH category_exclusions AS ( SELECT 'A' AS Category, 1 AS excluded_code UNION ALL SELECT 'A', 3 UNION ALL SELECT 'B', 2 UNION ALL SELECT 'B', 3 UNION ALL SELECT 'B', 5 UNION ALL SELECT 'C', 4 UNION ALL SELECT 'C', 5 ) SELECT t.Category, COUNT(*) AS `Total Transactions` FROM your_transaction_table t LEFT JOIN category_exclusions ce ON t.Category = ce.Category AND t.item_code = ce.excluded_code WHERE ce.excluded_code IS NULL GROUP BY t.Category;
要是你的MySQL版本低于8.0(不支持CTE),可以把CTE换成子查询:
SELECT t.Category, COUNT(*) AS `Total Transactions` FROM your_transaction_table t LEFT JOIN ( SELECT 'A' AS Category, 1 AS excluded_code UNION ALL SELECT 'A', 3 UNION ALL SELECT 'B', 2 UNION ALL SELECT 'B', 3 UNION ALL SELECT 'B', 5 UNION ALL SELECT 'C', 4 UNION ALL SELECT 'C', 5 ) ce ON t.Category = ce.Category AND t.item_code = ce.excluded_code WHERE ce.excluded_code IS NULL GROUP BY t.Category;
这两种写法都能得到你想要的结果,比如分类A处理后会显示570的交易数,你只需要把your_transaction_table换成你实际的表名就行。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

