Повернуть все данные о времени в столбце даты - PullRequest
0 голосов
/ 16 января 2020

Мне нужно создать отчет в SQL Служба отчетов сервера. Исходная таблица / данные запроса структурированы следующим образом:

 CNum |  EmpNo   |    TDate      | TimeIn    |  TimeOut 
  100 |  2       |   12/4/2019   |  7:00 AM  |  12:00 PM
  100 |  2       |   12/4/2019   |  12:30 PM |  3:30 PM
  100 |  2       |   12/5/2019   |  7:00 AM  |  12:00 PM
  100 |  2       |   12/5/2019   |  12:30 PM |  3:30 PM 

Мне нужно, чтобы выходные данные отчета отображались следующим образом (или что-то подобное, просто нужно показать TDate в виде столбцов и любые связанные записи времени на основе CNum в виде строк).

 CNum |  12/4/2019 |   12/5/2019 | 
  100 |  7:00 AM   |   7:00 AM   | 
      |  12:00 PM  |   12:00 PM  |  
  100 |  12:30 PM  |   12:30 PM  | 
      |  3:30 PM   |   3:30 PM   | 

Я пытался использовать Matrix Tablix, но это вынуждает группу возвращаться только по записи в день, когда их может быть несколько. Моя цель - написать SQL Query (CTE или PIVOT), который даст мне данные отчета в правильном формате, чтобы мне не пришлось сходить с ума в конструкторе отчетов.

Я знаком с SQL но по какой-то причине я не могу получить какой-либо запрос на вывод (Pivot) и включить обе записи за день.

Любая помощь / руководство будет высоко ценится.

Ответы [ 3 ]

1 голос
/ 16 января 2020

Вот ответ:

With CTE as (
    Select
        CNum,
        TDate,
        TimeIn as [Time],
        'In' as [Action]
    From TimeTable
    Union All
    Select
        CNum,
        TDate,
        [TimeOut] as [Time],
        'Out' as [Action]
    From TimeTable
)
Select
    *
From CTE
Pivot(min([Time]) for TDate in ([2019-12-04],[2019-12-05])) as pivot_table
union all
Select
    *
From CTE
Pivot(max([Time]) for TDate in ([2019-12-04],[2019-12-05])) as pivot_table
1 голос
/ 16 января 2020

Вы можете легко сделать это в SSRS, внеся небольшое изменение в запрос к набору данных.

Я воспроизвел ваши образцы данных со следующим

DECLARE @t TABLE(CNum int, EMpNo int, TDate Date, TimeIn Time, [Timeout] Time)
INSERT INTO @t VALUES
(100, 2, '2019/12/04', '07:00', '12:00'),
(100, 2, '2019/12/04', '12:30', '15:30'),
(100, 2, '2019/12/05', '07:00', '12:00'),
(100, 2, '2019/12/05', '12:30', '15:30')


SELECT *, ROW_NUMBER() OVER(PARTITION BY TDate, Cnum ORDER BY TimeIn) as RowN FROM @t 

Примечание. Я добавил RowN столбец, который дает каждой строке уникальный номер в каждом TDate и CNum. Мы добавляем это к группе CNum в матрице (поэтому она группируется по CNum, а затем по RowN)

Вот окончательный вариант, включающий группы строк и столбцов (группа столбцов только по TDate)

enter image description here

Чтобы получить 2-ую строку, я щелкнул правой кнопкой мыши по ячейке [TimeIn] и сделал «Вставить строку => Внутри группы - ниже»

Окончательный вывод выглядит так

enter image description here

1 голос
/ 16 января 2020
...