sql - 将数据附加到拆分的行
问题描述
我想知道有多少人在历史上几个月不可用,因为我有一个historicTable
包含 2012 年到 2018 年的数据,每一行包含员工不可用的时间(假期、生病等)这是一个例子:
idUser startDate endDate daysUn reason nameEmp
--------------------------------------------------------
123 25/01/2018 09/02/2018 12 Sickness John Doe
这是我每一行都需要的
idUser startDate endDate daysUn reason nameEmp
--------------------------------------------------------
123 25/01/2018 31/01/2018 5 Sickness John Doe
123 01/01/2018 09/02/2018 7 Sickness John Doe
我知道这在这里被问了数百次,但是我在为整个表执行此操作时遇到了麻烦,因为我在不同的答案中尝试过的所有过程都适用于给定 startdate 和 enddate 列的指定,而我需要的是追加所有数据到此表并按原样保存,以便分析师能够研究特定案例和特定员工。这就是我使用当前代码得到的结果:
original_INI original_FIN new_INI new_FIN
----------------------- ----------------------- ----------------------- -----------------------
2017-10-15 00:00:00.000 2018-01-06 00:00:00.000 2017-10-15 00:00:00.000 2017-10-31 00:00:00.000
2017-10-15 00:00:00.000 2018-01-06 00:00:00.000 2017-11-01 00:00:00.000 2017-11-30 00:00:00.000
2017-10-15 00:00:00.000 2018-01-06 00:00:00.000 2017-12-01 00:00:00.000 2017-12-31 00:00:00.000
2017-10-15 00:00:00.000 2018-01-06 00:00:00.000 2018-01-01 00:00:00.000 2018-01-06 00:00:00.000
这是代码,原始日期可以,因为我可以更全局地对数据进行排序,但它可以打印并保存其余数据,因此更具可读性:
;WITH n(n) AS
(
SELECT ROW_NUMBER() OVER (ORDER BY [object_id])-1 FROM sys.all_columns
),
d(n,f,t,md,bp,ep) AS
(
SELECT n.n, d.INI, d.FIN,
DATEDIFF(MONTH, d.INI, d.FIN),
DATEADD(MONTH, n.n, DATEADD(DAY, 1-DAY(INI), INI)),
DATEADD(DAY, -1, DATEADD(MONTH, 1, DATEADD(MONTH, n.n,
DATEADD(DAY, 1-DAY(INI), INI))))
FROM n INNER JOIN archivoFuente AS d
ON d.FIN >= DATEADD(MONTH, n.n-1, d.INI)
)
SELECT original_INI = f, original_FIN = t,
new_INI = CASE n WHEN 0 THEN f ELSE bp END,
new_FIN = CASE n WHEN md THEN t ELSE ep END
FROM d WHERE md >= n
ORDER BY original_INI, new_INI;
感谢您对查询的任何帮助。
解决方案
实际上这很简单,我对我的要求使用了相同的代码,您需要在每个语句中调用每一列,select
以便在拆分行时它存在,检查此代码:
;WITH n(n) AS
(
SELECT ROW_NUMBER() OVER (ORDER BY [object_id])-1 FROM sys.all_columns
),
d(n,f,t,md,bp,ep,
--CALL YOUR COLUMNS HERE EG: name, id, bla, ble
) AS
(
SELECT n.n,d.INI, d.FIN,
DATEDIFF(MONTH, d.INI, d.FIN),
DATEADD(MONTH, n.n, DATEADD(DAY, 1-DAY(INI), INI)),
DATEADD(DAY, -1, DATEADD(MONTH, 1, DATEADD(MONTH, n.n,
DATEADD(DAY, 1-DAY(INI), INI)))),
--CALL YOUR COLUMNS HERE AGAIN, PAY ATTENTION TO NAMES AND COMMAS
d.id_hr,d.Tipo,d.ID_tip,d.Nom_inc,d.RUT,d.Nombre,d.ID_emp,d.Nom_pos,d.Dias_durac,d.Num_lic,d.ID_usu_ap,d.ult_act
FROM n INNER JOIN archivoFuente AS d
ON d.FIN >= DATEADD(MONTH, n.n-1, d.INI)
)
SELECT --PUT ONCE AGAIN YOUR COLUMNS HERE, THIS WILL WORK FOR THE DISPLAYED RESULT
original_INI = f, original_FIN = t,
new_INI = CASE n WHEN 0 THEN f ELSE bp END,
new_FIN = CASE n WHEN md THEN t ELSE ep END
FROM d
WHERE md >= n
ORDER BY original_INI, new_INI;
现在,为了保存表,我建议INSERT
对新表使用语句,你会怎么做,我不知道,我和你在同一个地方。希望有人检查这个问题。
推荐阅读
- mongodb - 如何使用 mongo-driver 在 Go 中执行聚合
- azure - 何时将 OBO 与 Azure 结合使用
- tensorflow - 深度强化学习动手,第 7 章。无法让 tensorflow 工作
- mysql - 如何正确加入这4个tableview
- charts - 如何在一张图表中混合 Grafana 中的条形和线条
- angular - 角度,无法使用 [svgIcon]="lItem.svgIcon" 动态加载自定义 mat-icon
- java - 线程“主”java.lang.NegativeArraySizeException 中的 Java ArrayList 异常:-28
- javascript - 将 html 字符串和对象的映射数组反应到一个 DOM 元素
- python - Python:“int”对象在嵌套枚举(列表)中不可迭代
- c# - 来自 DataStream 的 SharpDX Texture2D