将每周工资信息分成每天
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
我正在尝试从我们的财务系统中获取工资数据并将其分解为每日 '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