将数据追加到分裂行

问题描述 投票:3回答:1

我想知道有多少人都好几个月没avaliable历史上,我有一个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

我知道这个被问的次数百在这里,但我无法这样做对整个表中,我在不同的答案已经试过了specifig给出开始日期和结束日期列的所有过程的工作,我需要的是给所有的追加数据该表并保存为,是为了让分析人员能够研究具体的案例和具体的员工。这就是我与我当前的代码:

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

这是代码,原来的日期都ok,我可以更多的全球数据进行排序,但它可以打印和保存数据,使其更具可读性的其余部分:

;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;

与查询任何帮助,它的赞赏。

sql sql-server-2008 common-table-expression
1个回答
2
投票

这是很容易其实,我用同样的代码,我的要求,你需要调用各列中的每个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语句的新表,你会怎么做,我不知道,我'在同一地点你。希望有人检查这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.