我想在SQL Server和Sqlite中应用unpivot函数[已关闭]

muk1a3rh  于 2023-04-30  发布在  SQLite
关注(0)|答案(1)|浏览(126)

已关闭,此问题需要details or clarity。目前不接受答复。
**想改善这个问题吗?**通过editing this post添加详细信息并澄清问题。

昨天关门了。
Improve this question
我有下表
| 星期一|星期二|星期三|星期四|星期五|周开始|
| --------------|--------------|--------------|--------------|--------------|--------------|
| 八个|八个|八个|八个|八个|2019-09-06 2019-09-06|
我想把它转换成下面的表格
| 星期|实际小时数|周开始|时间卡日期|
| --------------|--------------|--------------|--------------|
| 星期一|八个|2019-09-06 2019-09-06|2019-09-07 2019-09-07|
| 星期二|八个|2019-09-06 2019-09-06|2019-09-08|
| 星期三|八个|2019-09-06 2019-09-06|2019-09- 09 2019-09-09|
| 星期四|八个|2019-09-06 2019-09-06|2019-09-10 2019-09-10|
| 星期五|八个|2019-09-06 2019-09-06|2019-09-11 2019-09-11|
添加TimecardDate的逻辑用于Monday--〉WeekstartsOn+1,Tuesday--〉WeekstartsOn+2。...,星期五--〉WeekstartsOn+5
我已经试过下面的查询

SELECT ActualHrs,DayOftheWeek,WeekStartsOn
FROM (select Monday,Tuesday,Wednesday,Thursday,Friday,WeekStartsOn
from itplanning.enriched.timecard_enriched_current) as cp 
UNPIVOT 
( 
ActualHrs FOR DayOftheWeek IN (Monday,Tuesday,Wednesday,Thursday,Friday ) 
) 
AS PivotTable
where ActualHrs<>0

通过上面的查询,我得到了下面的表
| 星期|实际小时数|周开始|
| --------------|--------------|--------------|
| 星期一|八个|2019-09-06 2019-09-06|
| 星期二|八个|2019-09-06 2019-09-06|
| 星期三|八个|2019-09-06 2019-09-06|
| 星期四|八个|2019-09-06 2019-09-06|
| 星期五|八个|2019-09-06 2019-09-06|
无法做TimecardDate列。
实际表如下
| 星期一|星期二|星期三|星期四|星期五|周开始|
| --------------|--------------|--------------|--------------|--------------|--------------|
| 八个|八个|八个|八个|八个|2019-09-06 2019-09-06|
预期表如下
| 星期|实际小时数|周开始|时间卡日期|
| --------------|--------------|--------------|--------------|
| 星期一|八个|2019-09-06 2019-09-06|2019-09-07 2019-09-07|
| 星期二|八个|2019-09-06 2019-09-06|2019-09-08|
| 星期三|八个|2019-09-06 2019-09-06|2019-09- 09 2019-09-09|
| 星期四|八个|2019-09-06 2019-09-06|2019-09-10 2019-09-10|
| 星期五|八个|2019-09-06 2019-09-06|2019-09-11 2019-09-11|

ogsagwnx

ogsagwnx1#

你可以这样做:

SELECT  v.d,v.hours,DATEADD(DAY, v.addDay, WeekStartsOn), WeekStartsOn
FROM itplanning.enriched.timecard_enriched_current
CROSS APPLY (
  VALUES(Monday,'Monday', 1),(Tuesday,'Tuesday', 2),(Wednesday, 'Wednesday', 3),(Thursday, 'Thursday', 4),(Friday, 'Friday', 5)
 ) v(hours, d, addDay)
where hours<>0

我手动取消透视,并创建了一个包含周和要添加到周开始的天数的两列表
编辑:添加了一个替代方案,它与pivot语法

select *
,   dateadd(day, case DayOftheWeek when 'monday' then 1 when 'tuesday' then 2 when 'wednesday' then 3 when 'thursday' then 4 when 'friday' then 5 end, weekstartson) AS TimecardDate
FROM itplanning.enriched.timecard_enriched_current
UNPIVOT 
( 
ActualHrs FOR DayOftheWeek IN (Monday,Tuesday,Wednesday,Thursday,Friday ) 
) 
AS PivotTable

编辑#3(SQLite版本):

with cte as (
    select monday, 'monday', 1 AS addition, weekstartson
    from timecard_enriched_current
    union
    select tuesday, 'tuesday', 2, weekstartson
    from timecard_enriched_current
    union
    select wednesday, 'wednesday', 3, weekstartson
    from timecard_enriched_current
    union
    select thursday, 'thursday', 4, weekstartson
    from timecard_enriched_current
    union
    select friday, 'friday', 5, weekstartson
    from timecard_enriched_current
    ) 
select *, DATE(weekstartson, '+' || addition || ' days') AS TimecardDate
from cte
order by addition

相关问题