у меня ниже таблица
Я хочу преобразовать его в таблицу ниже
Логика добавления **TimecardDate ** есть для Понедельник --> Начало недели+1, Вторник --> Начало недели+2 .... , Пятница--> Начало недели+5
Я пробовал ниже Query
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
с этим запросом выше я получил таблицу ниже
Я не могу сделать столбец TimecardDate.
Актуальная таблица ниже
Ожидаемая таблица ниже
пожалуйста, добавьте данные вашего примера и ожидаемые.
Задавая вопрос, вы должны предоставить минимальный воспроизводимый пример: (1) DDL и выборочное заполнение данных, т. е. таблицы CREATE плюс операторы INSERT T-SQL. (2) Что вам нужно сделать, т. е. логика и ваш код попытаются реализовать ее в T-SQL. (3) Желаемый результат, основанный на примерных данных в # 1 выше. (4) Ваша версия SQL Server (SELECT @@version;). Все в вопросе в виде текста, без изображений.





Вместо этого вы можете сделать что-то вроде этого:
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
Я разворачиваю вручную и создаю таблицу из двух столбцов, содержащую неделю и количество дней, которые нужно добавить к началу недели.
Обновлено: добавлена альтернатива, которая делает это с помощью сводного синтаксиса.
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
Я пробовал этот запрос, но он показывает «Неверный столбец ActualHrs», но ActualHrs присутствует в БД.
извините, попробуйте эту версию :)
Я пытаюсь это сделать в Sqlite, но это не работает. Есть ли другая функция для этого?
добавлена версия, которая использует unpivot, но не уверена, что она работает с sqllite
В sqlite не работает
Хорошо, добавил еще одну версию :D
Хорошо. Эта версия, конечно, работает для сервера sql. Я не думаю, что вы можете получить один и тот же код, который работает в обоих из-за разницы в синтаксисе и функциях.