如何查询PIVOT透视数据?筛选轮胎非米其林且包含无轮胎记录车辆
解决方案
方法1:分组聚合查询(更简洁高效,无需使用PIVOT)
直接按汽车名称分组,通过聚合条件做过滤即可满足需求,SQL语句如下:
SELECT car_name FROM cars GROUP BY car_name HAVING COUNT(CASE WHEN part_type = 'Tyre' AND part_name LIKE 'Michelin%' THEN 1 END) = 0;
逻辑说明:统计每辆车「存在米其林开头的轮胎记录」的数量,只要该数量为0,就说明车辆要么没有轮胎记录,要么有轮胎但不是米其林开头,完全匹配你的需求。
方法2:使用PIVOT实现(匹配你原先的实现思路)
你原来的PIVOT写法存在语法问题:Oracle的PIVOT语法中FOR子句的枚举值默认不能直接跟动态子查询,需要显式指定枚举值或者使用XML模式,针对当前需求只需要判断轮胎字段即可,写法如下:
SELECT car_name FROM ( SELECT car_name, part_type, part_name FROM cars ) PIVOT ( LISTAGG(part_name, ',') WITHIN GROUP (ORDER BY part_name) FOR part_type IN ('Tyre' AS tyre) ) WHERE tyre IS NULL OR tyre NOT LIKE 'Michelin%';
执行后返回的结果就是Audi和Mazda,符合预期。
内容的提问来源于stack exchange,提问作者opticyclic
相关产品推荐
相关产品推荐

