Oracle SQL统计TR_VALUE.NEW_VALUE重复值并展示其他列数据问题
语法错误原因
你当前语句执行失败的核心原因是SQL GROUP BY语法约束:SELECT子句中,除了聚合函数(比如COUNT、SUM这类)之外的所有普通字段,都必须出现在GROUP BY子句中。你原语句仅对TR_VALUE.NEW_VALUE做了分组,但是SELECT中包含了未分组的TR_VALUE.OLD_VALUE,因此语法校验不通过。
调整方案
根据你的需求,有两种常用实现方式:
方案1:保留所有重复NEW_VALUE对应的全量明细行
如果你需要查看每个重复的NEW_VALUE对应的每一条OLD_VALUE、关联工单、批次等完整明细信息,推荐使用窗口函数提前统计NEW_VALUE的重复次数,再做过滤:
SELECT * FROM ( SELECT "TR_VALUE"."NEW_VALUE", "TR_VALUE"."OLD_VALUE", -- 按NEW_VALUE分组统计出现次数 COUNT("TR_VALUE"."NEW_VALUE") OVER(PARTITION BY "TR_VALUE"."NEW_VALUE") AS repeat_cnt, -- 你可以按需在这里添加其他需要展示的关联表字段 "WORKORDER"."FG_LOTNO", "STANDARD"."NAME" AS STANDARD_NAME, "TR_BATCH"."BATCH_NO" FROM "DB1"."WORKORDER" "WORKORDER" LEFT OUTER JOIN "DB1"."TR_VALUE" "TR_VALUE" ON "WORKORDER"."FG_LOTNO" = "TR_VALUE"."NEW_VALUE" LEFT OUTER JOIN "DB1"."STANDARD" "STANDARD" ON "WORKORDER"."STANDARD_ID" = "STANDARD"."ID" LEFT OUTER JOIN "DB1"."TR_BATCH" "TR_BATCH" ON "TR_VALUE"."TR_BATCH_ID" = "TR_BATCH"."ID" ) t WHERE repeat_cnt > 1 -- 可以按NEW_VALUE排序,方便查看同一值的所有重复记录 ORDER BY "NEW_VALUE"
方案2:每个重复NEW_VALUE仅展示一行,合并所有关联的OLD_VALUE
如果你不需要明细,仅需要每个重复NEW_VALUE对应一行,把所有关联的OLD_VALUE合并展示,可以使用字符串聚合函数,注意不同数据库的聚合函数有差异:
SELECT "TR_VALUE"."NEW_VALUE", -- 按需替换为你使用的数据库对应的聚合函数:MySQL用GROUP_CONCAT、Oracle用LISTAGG、PostgreSQL用STRING_AGG GROUP_CONCAT(DISTINCT "TR_VALUE"."OLD_VALUE" SEPARATOR '、') AS OLD_VALUE_LIST, COUNT("TR_VALUE"."NEW_VALUE") AS repeat_cnt FROM "DB1"."WORKORDER" "WORKORDER" LEFT OUTER JOIN "DB1"."TR_VALUE" "TR_VALUE" ON "WORKORDER"."FG_LOTNO" = "TR_VALUE"."NEW_VALUE" LEFT OUTER JOIN "DB1"."STANDARD" "STANDARD" ON "WORKORDER"."STANDARD_ID" = "STANDARD"."ID" LEFT OUTER JOIN "DB1"."TR_BATCH" "TR_BATCH" ON "TR_VALUE"."TR_BATCH_ID" = "TR_BATCH"."ID" GROUP BY "TR_VALUE"."NEW_VALUE" HAVING COUNT("TR_VALUE"."NEW_VALUE") > 1
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

