我正在尝试根据具有不同列值的ID号将行合并为一个。在此示例中,我将基于Case语句创建新的列值。请在下面查看我的代码以及实际结果与预期。非常感谢您的帮助。
SELECT *
FROM (
SELECT CTR_NMBR, CODE, EXEC_ID,
CASE
WHEN CODE = '2_EXEC_ZERO'
THEN 2
Else NULL
END AS Exclude_Zero,
CASE
WHEN CODE = '3_EXEC_MAT'
THEN 3
Else NULL
END AS Exclude_Mat
FROM EXCLUDED)
WHERE COALESCE(Exclude_Zero, Exclude_Mat) IS NOT NULL;
实际结果:
CTR_NMBR CODE EXEC_ID Exclude_Zero Exclude_Mat
E0105753 2_EXEC_ZERO 565 2
E0105753 3_EXEC_MAT 565 3
预期结果:
CTR_NMBR EXEC_ID Exclude_Zero Exclude_Mat
E0105753 565 2 3
答案 0 :(得分:2)
我认为您想要汇总:
SELECT CTR_NMBR, EXEC_ID,
MAX(CASE WHEN CODE = '2_EXEC_ZERO' THEN 2
END) AS Exclude_Zero,
MAX(CASE WHEN CODE = '3_EXEC_MAT' THEN 3
END) AS Exclude_Mat
FROM EXCLUDED
GROUP BY CTR_NMBR, EXEC_ID;
答案 1 :(得分:1)
从选择中删除code
并进行条件汇总
SELECT CTR_NMBR, EXEC_ID,
max(CASE
WHEN CODE = '2_EXEC_ZERO'
THEN 2 end)
AS Exclude_Zero,
max( CASE
WHEN CODE = '3_EXEC_MAT'
THEN 3 end) AS Exclude_Mat
FROM EXCLUDED group by CTR_NMBR, EXEC_ID
答案 2 :(得分:1)
您可以将decode
与aggregation
一起使用,regex
可以从code
列中动态提取数字
with excluded(ctr_nmbr, code, exec_id ) as
(
select 'E0105753', '2_EXEC_ZERO', 565 from dual union all
select 'E0105753', '3_EXEC_MAT', 565 from dual
)
select ctr_nmbr, exec_id,
max(decode(code,'2_EXEC_ZERO',regexp_substr(code,'[^_]+',1),null)) as Exclude_Zero,
max(decode(code,'3_EXEC_MAT',regexp_substr(code,'[^_]+',1),null)) as Exclude_Mat
from excluded
group by ctr_nmbr, exec_id;