将每周工资信息分成每天

Dividing weekly salary info into daily

我正在尝试从我们的财务系统中获取工资数据并将其分解为每日 'costs' 以便它与我们的小时工对齐以进行更好的数据分析。

现在,薪资数据(大致)如下所示:

TRXBEGDT  trxenddt  StoreID LaborHours LaborCost
----------------------------------------------
1/12/2020 1/18/2020 1000    40         2000
1/12/2020 1/18/2020 2300    80         4000
1/20/2020 1/20/2020 1000    8          400
1/20/2020 1/20/2020 2300    16         800
1/19/2020 1/25/2020 1000    32         1600
1/19/2020 1/25/2020 2300    64         3200

我需要在 trxbegdt 和 trxenddt 之间拆分 LaborHours 和 LaborCost,通常是一天或七天,但不一定。

我很乐意提供一个很好的起点,但我不知道从哪里开始。

最终结果如下所示:

Date    StoreID LaborHours  LaborCost
-------------------------------------
1/12/2020   1000    5.71    285.5
1/13/2020   1000    5.71    285.5
1/14/2020   1000    5.71    285.5
1/15/2020   1000    5.71    285.5
1/16/2020   1000    5.71    285.5
1/17/2020   1000    5.71    285.5
1/18/2020   1000    5.71    285.5
1/19/2020   1000    4.57    228.5
1/20/2020   1000    12.57   628.5
1/21/2020   1000    4.57    228.5
1/22/2020   1000    4.57    228.5
1/23/2020   1000    4.57    228.5
1/24/2020   1000    4.57    228.5
1/25/2020   1000    4.57    228.5
1/12/2020   2300    11.43   571.5
1/13/2020   2300    11.43   571.5
1/14/2020   2300    11.43   571.5
1/15/2020   2300    11.43   571.5
1/16/2020   2300    11.43   571.5
1/17/2020   2300    11.43   571.5
1/18/2020   2300    11.43   571.5
1/19/2020   2300    9.14    457
1/20/2020   2300    25.14   1257
1/21/2020   2300    9.14    457
1/22/2020   2300    9.14    457
1/23/2020   2300    9.14    457
1/24/2020   2300    9.14    457
1/25/2020   2300    9.14    457

我确实意识到这并不能使数据 100% 准确,但它比让所有受薪员工在一天内受到打击要准确得多。

感谢任何帮助。

一个选项使用递归查询:

with cte as (
    select 
        trxbedgt dt, 
        storeid, 
        1.0 * laborhours / datediff(day, trxbedgt, trxenddt) laborhours, 
        1.0 * laborcost / datediff(day, trxbedgt, trxenddt) laborcost, 
        trxenddt max_dt
    from mytable
    union all
    select dateadd(day, 1, dt), store_id, laborhours, laborcost, max_dt
    from cte
    where dt < max_dt
)
select dt, storeid, laborhours, laborcost 
from cte 
order by store, dt

这适用于可变长度的日期范围。如果它们是固定的,那么 cross apply 更简单:

select x.dt, t.store_id, 
        1.0 * t.laborhours / datediff(day, t.trxbedgt, t.trxenddt) laborhours, 
        1.0 * t.laborcost  / datediff(day, t.trxbedgt, t.trxenddt) laborcost
from mytable t
cross apply (values 
    (trxbedgt), 
    (datead(day, 1, trxbedgt)), 
    (datead(day, 2, trxbedgt))
    ...
    (datead(day, 6, trxbedgt))
) x(dt)
order by t.store_id, x.dt