Oracle中拆分重复行时实现列值相减并重置列值的技术求助
Solution for Calculating Time Difference and Splitting Rows
我来帮你搞定这个需求!你需要先计算WORKING_TIME_MINS - TRAVEL_TIME_MINS得到净工作时间,再把记录拆分成两行,分别展示净工作时间(旅行时间置0)和旅行时间(工作时间置0)。可以通过以下SQL实现:
SELECT EMPLOYEE_ID, -- 第一行显示净工作时间(原工作时间减旅行时间),旅行时间设为0 CASE WHEN seq = 1 THEN WORKING_TIME_MINS - TRAVEL_TIME_MINS ELSE 0 END AS WORKING_TIME_MINS, -- 第二行显示原始旅行时间,工作时间设为0 CASE WHEN seq = 2 THEN TRAVEL_TIME_MINS ELSE 0 END AS TRAVEL_TIME_MINS, UNIQUE_JOB_NO FROM CONNECT_BY_LVL_EXAMPLE_2, ( -- 生成两行标记,分别对应工作时间行和旅行时间行 SELECT 1 AS seq FROM DUAL UNION ALL SELECT 2 AS seq FROM DUAL ) -- 只处理有旅行时间的记录,避免为无旅行时间的记录生成多余行 WHERE TRAVEL_TIME_MINS > 0;
代码解释
- 生成行标记:用
UNION ALL创建一个包含seq=1和seq=2的临时数据集,用来控制拆分出的两行数据。 - 条件赋值:通过
CASE语句根据seq的值分别计算列值:- 当
seq=1时,WORKING_TIME_MINS取差值,TRAVEL_TIME_MINS置为0 - 当
seq=2时,WORKING_TIME_MINS置为0,TRAVEL_TIME_MINS保留原始值
- 当
- 过滤无效记录:
WHERE TRAVEL_TIME_MINS > 0确保只有存在旅行时间的记录才会被拆分,避免生成不必要的空行。
执行结果
运行上述SQL后,你会得到期望的输出:
| EMPLOYEE_ID | WORKING_TIME_MINS | TRAVEL_TIME_MINS | UNIQUE_JOB_NO |
|---|---|---|---|
| 123456789 | 11 | 0 | VP25 |
| 123456789 | 0 | 62 | VP25 |
内容的提问来源于stack exchange,提问作者Michael Owen
相关产品推荐
相关产品推荐

