Я хочу применить функцию unpivot в SQL Server и Sqllite

у меня ниже таблица

Понедельник Вторник Среда Четверг Пятница WeekStartsOn 8 8 8 8 8 2019-09-06

Я хочу преобразовать его в таблицу ниже

День недели Фактические часы WeekStartsOn ТаймкартаДата Понедельник 8 2019-09-06 2019-09-07 Вторник 8 2019-09-06 2019-09-08 Среда 8 2019-09-06 2019-09-09 Четверг 8 2019-09-06 2019-09-10 Пятница 8 2019-09-06 2019-09-11

Логика добавления **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 

с этим запросом выше я получил таблицу ниже

День недели Фактические часы WeekStartsOn Понедельник 8 2019-09-06 Вторник 8 2019-09-06 Среда 8 2019-09-06 Четверг 8 2019-09-06 Пятница 8 2019-09-06

Я не могу сделать столбец TimecardDate.

Актуальная таблица ниже

Понедельник Вторник Среда Четверг Пятница WeekStartsOn 8 8 8 8 8 2019-09-06

Ожидаемая таблица ниже

День недели Фактические часы WeekStartsOn ТаймкартаДата Понедельник 8 2019-09-06 2019-09-07 Вторник 8 2019-09-06 2019-09-08 Среда 8 2019-09-06 2019-09-09 Четверг 8 2019-09-06 2019-09-10 Пятница 8 2019-09-06 2019-09-11

пожалуйста, добавьте данные вашего примера и ожидаемые.

abolfazl sadeghi 27.04.2023 18:47

Задавая вопрос, вы должны предоставить минимальный воспроизводимый пример: (1) DDL и выборочное заполнение данных, т. е. таблицы CREATE плюс операторы INSERT T-SQL. (2) Что вам нужно сделать, т. е. логика и ваш код попытаются реализовать ее в T-SQL. (3) Желаемый результат, основанный на примерных данных в # 1 выше. (4) Ваша версия SQL Server (SELECT @@version;). Все в вопросе в виде текста, без изображений.

Yitzhak Khabinsky 27.04.2023 19:06
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
3
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вместо этого вы можете сделать что-то вроде этого:

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 присутствует в БД.

Sourav Guha 27.04.2023 19:20

извините, попробуйте эту версию :)

siggemannen 27.04.2023 19:24

Я пытаюсь это сделать в Sqlite, но это не работает. Есть ли другая функция для этого?

Sourav Guha 28.04.2023 23:04

добавлена ​​версия, которая использует unpivot, но не уверена, что она работает с sqllite

siggemannen 28.04.2023 23:16

В sqlite не работает

Sourav Guha 28.04.2023 23:39

Хорошо, добавил еще одну версию :D

siggemannen 29.04.2023 00:01

Хорошо. Эта версия, конечно, работает для сервера sql. Я не думаю, что вы можете получить один и тот же код, который работает в обоих из-за разницы в синтаксисе и функциях.

siggemannen 29.04.2023 08:07

Другие вопросы по теме