Сводные дни / часы на SQL сервере от заголовка до уровня строки - PullRequest
0 голосов
/ 06 августа 2020

У меня есть список часов, которые находятся под заголовками от и до. Мне нужно развернуть те, которые будут по дням с заголовками от и до. Я пробовал выполнить отключение в Excel и Pivot на сервере SQL, ничего не работает. Каждый день соответствует SEQ_NO (понедельник = 10, вторник = 20 и т. Д. c.). Основная проблема здесь в том, чтобы время начала и окончания отображалось по-разному. Ниже приведены до и после которых я хочу, чтобы это выглядело. Ниже приведены до и после (как я хочу, чтобы это выглядело).

Как я хочу, чтобы он выглядел
После просмотра (как я хочу, чтобы он выглядел ):

До:

Name   ║ ID2       ║ Mon Hour Start ║ Mon Hour End ║ Tues Hour Start ║ Tues Hour End ║ Wed Hour Start ║ Wed Hour End ║ Thurs Hour Start ║ Thurs Hour End ║ Fri Hour Start ║ Fri Hour End ║ Sat Hour Start ║ Sat Hour End ║ Sun Hour Start ║ Sun Hour End ║ 
╠══════╬═══════════╬════════════════╬══════════════╬═════════════════╬═══════════════╬════════════════╬══════════════╬══════════════════╬════════════════╬════════════════╬══════════════╬════════════════╬══════════════╬════════════════╬══════════════╣
║ John ║ 123456789 ║ 07:45 AM       ║ 11:59 PM     ║ 07:45 AM        ║ 11:59 PM      ║ 07:45 AM       ║ 11:59 PM     ║ 07:45 AM         ║ 11:59 PM       ║ 07:45 AM       ║ 11:59 PM     ║                ║              ║                ║              ║  

После:

╔════════╦══════════════╦═══════════╦══════════╦══╦══╦══╦══╦══╦══╦══╦══╦══╦══╦══╦══╦══╗
║ SEQ_NO ║ DAYS         ║ DAYS_FROM ║ DAYS_TO  ║  ║  ║  ║  ║  ║  ║  ║  ║  ║  ║  ║  ║  ║
╠════════╬══════════════╬═══════════╬══════════╬══╬══╬══╬══╬══╬══╬══╬══╬══╬══╬══╬══╬══╣
║ 10     ║ Monday       ║ 7:45 AM   ║ 11:59 PM ║  ║  ║  ║  ║  ║  ║  ║  ║  ║  ║  ║  ║  ║
╠════════╬══════════════╬═══════════╬══════════╬══╬══╬══╬══╬══╬══╬══╬══╬══╬══╬══╬══╬══╣
║ 20     ║ Tuesday      ║ 7:45 AM  ║ 11:59 PM ║  ║  ║  ║  ║  ║  ║  ║  ║  ║  ║  ║  ║  ║
╠════════╬══════════════╬═══════════╬══════════╬══╬══╬══╬══╬══╬══╬══╬══╬══╬══╬══╬══╬══╣
║ 30     ║ Wednesday    ║ 7:45 AM  ║ 11:59 PM ║  ║  ║  ║  ║  ║  ║  ║  ║  ║  ║  ║  ║  ║
╠════════╬══════════════╬═══════════╬══════════╬══╬══╬══╬══╬══╬══╬══╬══╬══╬══╬══╬══╬══╣
║ 40     ║ Thursday     ║ 7:45 AM  ║ 11:59 PM ║  ║  ║  ║  ║  ║  ║  ║  ║  ║  ║  ║  ║  ║
╠════════╬══════════════╬═══════════╬══════════╬══╬══╬══╬══╬══╬══╬══╬══╬══╬══╬══╬══╬══╣
║ 50     ║ Friday       ║ 7:45 AM  ║ 11:59 PM ║  ║  ║  ║  ║  ║  ║  ║  ║  ║  ║  ║  ║  ║
╠════════╬══════════════╬═══════════╬══════════╬══╬══╬══╬══╬══╬══╬══╬══╬══╬══╬══╬══╬══╣
║ 60     ║ Saturday     ║   ║  ║  ║  ║  ║  ║  ║  ║  ║  ║  ║  ║  ║  ║  ║
╠════════╬══════════════╬═══════════╬══════════╬══╬══╬══╬══╬══╬══╬══╬══╬══╬══╬══╬══╬══╣
║ 70     ║ Sunday       ║   ║  ║  ║  ║  ║  ║  ║  ║  ║  ║  ║  ║  ║  ║  ║
╚════════╩══════════════╩═══════════╩══════════╩══╩══╩══╩══╩══╩══╩══╩══╩══╩══╩══╩══╩══╝

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Думаю, вы могли бы использовать UNPIVOT:

SELECT [ID2]
, [SEQ_NO] = case 
    when DaysF like 'Mon%' then 10
    when DaysF like 'Tues%' then 20
    when DaysF like 'Wed%' then 30
    when DaysF like 'Thurs%' then 40
    when DaysF like 'Fri%' then 50
    when DaysF like 'Sat%' then 60
    when DaysF like 'Sun%' then 70 end
, [DAYS] = case 
    when DaysF like 'Mon%' then 'Monday'
    when DaysF like 'Tues%' then 'Tuesday'
    when DaysF like 'Wed%' then 'Wednesday'
    when DaysF like 'Thurs%' then 'Thursday'
    when DaysF like 'Fri%' then 'Friday'
    when DaysF like 'Sat%' then 'Saturday'
    when DaysF like 'Sun%' then 'Sunday' end
, [DAYS_FROM], [DAYS_TO] FROM   
(
    SELECT 
        [Name], [ID2]
        , [Mon Hour Start] as [Mon Hour Start1], [Mon Hour End] as [Mon Hour End1], [Tues Hour Start] as [Tues Hour Start2]
        , [Tues Hour End] as [Tues Hour End2], [Wed Hour Start] as [Wed Hour Start3], [Wed Hour End] as [Wed Hour End3]
        , [Thurs Hour Start] as [Thurs Hour Start4], [Thurs Hour End] as [Thurs Hour End4], [Fri Hour Start] as [Fri Hour Start5]
        , [Fri Hour End] as [Fri Hour End5], [Sat Hour Start] as [Sat Hour Start6], [Sat Hour End] as [Sat Hour End6]
        , [Sun Hour Start] as [Sun Hour Start7], [Sun Hour End] as [Sun Hour End7]
    FROM 
        @table
) t 
UNPIVOT 
(
  [DAYS_FROM] FOR [DaysF] IN ([Mon Hour Start1], [Tues Hour Start2], [Wed Hour Start3], [Thurs Hour Start4], [Fri Hour Start5], [Sat Hour Start6], [Sun Hour Start7])
) AS df
UNPIVOT 
(
  [DAYS_TO] FOR [DaysT] IN ([Mon Hour End1], [Tues Hour End2], [Wed Hour End3], [Thurs Hour End4], [Fri Hour End5], [Sat Hour End6], [Sun Hour End7])
) AS dt
where right([DaysF],1) = right([DaysT],1)
;
1 голос
/ 06 августа 2020

Вы можете go для UNPIVOT, а затем PIVOT. См. Пример ниже. Я считал только понедельник, вторник. Вы можете экстраполировать то же самое на оставшиеся дни.

DECLARE @table table(Name varchar(50), ID2 DECIMAL(18,0), [Mon Hour Start] CHAR(8), [Mon Hour End] CHAR(8), 
[Tue Hour Start] CHAR(8), [Tue Hour End] CHAR(8))

INSERT INTO @table values ('John',123456789,'07:45 AM','11:59 PM', '07:45 AM','11:59 PM')

select SEQ_ID, days, [DAYS_FROM],[DAYS_TO] from 
(SELECT Name, id2, 
CASE WHEN LEFT([day],3) = 'MON' THEN 10 WHEN LEFT([day],3) = 'TUE' THEN 20 END as SEQ_ID , 
CASE WHEN LEFT([day],3) = 'MON' THEN 'MONDAY' WHEN LEFT([day],3) = 'TUE' THEN 'TUESDAY' END as [days],
CASE WHEN RIGHT([day],3) = 'END' THEN 'DAYS_TO' ELSE 'DAYS_FROM' end DayCategory,
val FROM @table
unpivot
(
val for [Day] in ([Mon Hour Start], [Mon Hour End],[Tue Hour Start], [Tue Hour End]) 
) as up) as t
PIVOT
(
   MAX(val)
   for DayCategory in ([DAYS_FROM],[DAYS_TO])
)as pvt

+--------+---------+-----------+----------+
| SEQ_ID |  days   | DAYS_FROM | DAYS_TO  |
+--------+---------+-----------+----------+
|     10 | MONDAY  | 07:45 AM  | 11:59 PM |
|     20 | TUESDAY | 07:45 AM  | 11:59 PM |
+--------+---------+-----------+----------+

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...