sql - SQL 拆分行
问题描述
请告诉我如何按照下面描述的方式拆分记录。
我有一张如下表
当前数据
EMPL | C2 | C3 | DateFrom | DateTo | C6 | C7
-----+----+----+------------+------------+----+----
1 | B | C | 11/27/2018 | 12/31/9999 | D | E
2 | B | C | 11/27/2018 | 05/31/2019 | D | E
3 | B | C | 11/27/2017 | 06/31/2019 | D | E
我需要根据当年将每条线分成两个或更多记录。
在 EMPL 1 的情况下,我需要将行一分为二,其中一个我必须输入当年的最后一天,另一个应该将 DateFrom 设置为明年的第一天,但 DateTo 应该是 12/31/9999
在 EMPL 2 的情况下,我需要将此记录拆分为两个记录,如示例所示
案例 3 应产生 3 份记录,每年一份。
结果
EMPL | C2 | C3 | DateFrom | DateTo | C6 | C7
-----+----+----+------------+------------+----+---
1 | B | C | 11/27/2018 | 12/31/2018 | D | E
1 | B | C | 01/01/2019 | 12/31/9999 | D | E
2 | B | C | 11/27/2018 | 12/31/2018 | D | E
2 | B | C | 01/01/2019 | 05/31/2019 | D | E
3 | B | C | 11/27/2017 | 12/31/2017 | D | E
3 | B | C | 01/01/2018 | 12/31/2018 | D | E
3 | B | C | 01/01/2019 | 06/31/2019 | D | E
解决方案
甲骨文设置:
CREATE TABLE table_name ( EMPL, C2, C3, DateFrom, DateTo, C6, C7 ) AS
SELECT 1, 'B', 'C', DATE '2018-11-27', DATE '9999-12-31', 'D', 'E' FROM DUAL UNION ALL
SELECT 2, 'B', 'C', DATE '2018-11-27', DATE '2019-05-31', 'D', 'E' FROM DUAL UNION ALL
SELECT 3, 'B', 'C', DATE '2017-11-27', DATE '2019-06-30', 'D', 'E' FROM DUAL;
查询:
WITH years ( EMPL, C2, C3, DateFrom, DateTo, C6, C7, YearEnd ) AS (
SELECT t.*,
ADD_MONTHS( TRUNC( DateFrom, 'YYYY' ), 12 ) - 1
FROM table_name t
UNION ALL
SELECT EMPL,
C2,
C3,
YearEnd + 1,
DateTo,
C6,
C7,
CASE WHEN YearEnd + 1 < SYSDATE
THEN ADD_MONTHS( YearEnd, 12 )
ELSE DateTo
END
FROM years
WHERE YearEnd < DateTo
)
SELECT EMPL,
C2,
C3,
DateFrom,
LEAST( YearEnd, DateTo ) AS DateTo,
C6,
C7
FROM years
ORDER BY Empl, C2, C3, C6, C7, DateFrom;
输出:
EMPL C2 C3 DATEFROM DATETO C6 C7
---- -- -- ---------- ---------- -- --
1 B C 2018-11-27 2018-12-31 D E
1 B C 2019-01-01 9999-12-31 D E
2 B C 2018-11-27 2018-12-31 D E
2 B C 2019-01-01 2019-05-31 D E
3 B C 2017-11-27 2017-12-31 D E
3 B C 2018-01-01 2018-12-31 D E
3 B C 2019-01-01 2019-06-30 D E
推荐阅读
- java - 无法实例化 android 驱动程序 appium 1.8.1
- sql - 无法更新列的格式化值
- html - 输入框搜索输入键
- python - Tkinter:滚动条显示但不起作用
- python-3.x - 在 seaborn catplot 中指定颜色
- c# - 为什么我的 Asp.Net 控制器中的 IFormFile 没有发生模型绑定?
- python - 如何更新复杂 Python 字典中的键名
- machine-learning - 为多输入 Keras 模型设计数据生成器的正确方法是什么?
- database - MongoDB 如何使 2 个嵌套文档具有相同的 _id?
- c - 尝试使用 sendto() 发送消息时出错