sql - 将 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 中做到这一点?
解决方案
鉴于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
已经存在的记录。
推荐阅读
- php - 如何在 Pimcore 中自定义区域块的图标
- java - 缺少对本地安装的 atrifact 的 Maven 依赖
- google-calendar-api - 对于少数事件,获取 google-calendar 事件 ID 的大小超过 200 个字符。我需要 <200 个字符?
- operator-overloading - 为什么在 Ada 中不允许匿名访问对象之间的隐式转换?
- reactjs - 试图访问传递给其他组件的关键属性,但在组件中它被传递
- android - 如何使用用于聊天应用程序的 socket.io 将反应本机应用程序连接到实时 URL 服务器?
- symfony - Symfony Doctrine 字段类型转换 DC2Type:array -> DC2Type:json
- android - 如何在所有分支中更改 android 项目的包名?
- spring-boot - ObjectMapper 抛出 NullPointerException
- ios - 通知服务扩展 - 隐藏以前的通知