首页 > 解决方案 > 将 3 个字段合并为 1 个值 - Oracle SQL

问题描述

我有一张桌子:

表格1

id  e_id        e_nm        e_value             line_num
59  BHT03-01    Ref ID      04/18/1820          4
59  BHT03-02                38                  4
59  BHT03-03                10                  4
59  ABC03-01    Ref ID      04/18/1820          4
59  ABC03-02                38                  4
59  ABC03-03                10                  4
60  BHT03-01    Ref ID      05/09/1820          4
60  BHT03-02                52                  4
60  BHT03-03                43                  4

我需要将每个 BHT03-01、BHT03-02 和 BHT03-03 用 : 分隔为每个 id 和 line_num 的 1 个 BHT03-01。

除了 BHT03-01 之外的所有其他 e_id 应该不受影响。

这是输出:

表格1

id  e_id        e_nm        e_value             line_num
59  BHT03-01    Ref ID      04/18/1820:38:10    4
59  BHT03-02                38                  4
59  BHT03-03                10                  4
59  ABC03-01    Ref ID      04/18/1820          4
59  ABC03-02                38                  4
59  ABC03-03                10                  4
60  BHT03-01    Ref ID      05/09/1820:52:43    4
60  BHT03-02                52                  4
60  BHT03-03                43                  4

一旦我得到这个表,我还必须删除所有带有 BHT03-02、BHT03-03 的行。

我怎样才能在 Oracle SQL 中做到这一点?

标签: sqloracle

解决方案


鉴于e_value列中的更新值实际上是派生数据,我建议您在选择时创建一个计算列,也许在视图中:

SELECT
    id,
    e_id,
    e_nm,
    CASE WHEN e_id LIKE 'BHT03%' AND
         ROW_NUMBER() OVER (PARTITION BY id, line_num ORDER BY e_id) = 1
         THEN LISTAGG(e_value, ':') WITHIN GROUP (ORDER BY e_id)
               OVER (PARTITION BY id, line_num)
         ELSE e_value END AS e_value,
    line_num
FROM yourTable
ORDER BY
    id,
    e_id;

上述逻辑检测每组中的第一行id,该行应该对应于列中有日期的e_value行。在第一行的情况下,它显示id组中所有记录的冒号分隔的串联,否则它只是重复e_value已经存在的记录。


推荐阅读