You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL查询:按JobNum/AssemblyNum返回生产位置,无匹配返回默认值

解决SQL分组后按OpCode返回对应值的问题

问题核心

需要按JobNum和AssemblyNum分组返回结果:若组内存在OpCode为PU/PU-A/PU-B/PU-C的记录,返回对应预设值(PU→Sub,PU-A→Sub A等);若组内无此类记录,返回Inhouse。之前用单纯的CASE/IF表达式会丢失无PU类记录的分组,以下是两种可行方案:

方案一:聚合函数+COALESCE

利用MAX聚合提取组内的PU类对应值,无PU类时用COALESCE返回默认值:

SELECT 
    JobNum,
    AssemblyNum,
    COALESCE(
        MAX(CASE 
            WHEN OpCode = 'PU' THEN 'Sub'
            WHEN OpCode = 'PU-A' THEN 'Sub A'
            WHEN OpCode = 'PU-B' THEN 'Sub B'
            WHEN OpCode = 'PU-C' THEN 'Sub C'
            ELSE NULL
        END),
        'Inhouse'
    ) AS Location
FROM YourTableName
GROUP BY JobNum, AssemblyNum;

逻辑说明:CASE将PU类转成对应值,其他转NULL;MAX会忽略NULL,返回组内有效的PU类对应值;若组内全为NULL,COALESCE兜底返回Inhouse,确保所有分组都有结果。

方案二:窗口函数优先取值

通过窗口函数给PU类记录标记更高优先级,取每组的第一条记录:

WITH RankedOps AS (
    SELECT 
        JobNum,
        AssemblyNum,
        CASE 
            WHEN OpCode = 'PU' THEN 'Sub'
            WHEN OpCode = 'PU-A' THEN 'Sub A'
            WHEN OpCode = 'PU-B' THEN 'Sub B'
            WHEN OpCode = 'PU-C' THEN 'Sub C'
            ELSE 'Inhouse'
        END AS Location,
        ROW_NUMBER() OVER (
            PARTITION BY JobNum, AssemblyNum 
            ORDER BY 
                CASE WHEN OpCode IN ('PU','PU-A','PU-B','PU-C') THEN 0 ELSE 1 END,
                OpCode
        ) AS rn
    FROM YourTableName
)
SELECT JobNum, AssemblyNum, Location
FROM RankedOps
WHERE rn = 1;

逻辑说明:窗口函数中,PU类记录的排序优先级设为0(靠前),其他为1(靠后);ROW_NUMBER()给每组记录编号后,取rn=1的记录,优先返回PU类对应值,无PU类时返回Inhouse。

内容的提问来源于stack exchange,提问作者mchernecki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 17:03:17