Sql Pivot вовремя - PullRequest
       8

Sql Pivot вовремя

0 голосов
/ 28 октября 2018

Таблица 1: Данные о ежедневной посещаемости:

    att_date    emp_code    emp_name    in_time                out_time
    2018-10-21  9999         Test   2018-10-21 08:00:00.000   2018-10-22 06:00:00.000

Таблица 2: Trnevents

emp_readr_id    DT              EVENTID
    9999    2018-10-24 07:00:00.000 0
    9999    2018-10-24 05:00:00.000 0
    9999    2018-10-24 03:00:00.000 0
    9999    2018-10-23 21:00:00.000 0
    9999    2018-10-23 19:00:00.000 0
    9999    2018-10-23 06:00:00.000 0
    9999    2018-10-22 06:00:00.000 0
    9999    2018-10-21 08:00:00.000 0

Я использовал этот запрос, чтобы получитьвсе время между временем и временем, ниже запрос работает нормально, но я пытаюсь сделать в строке с помощью сводной.При использовании времени разворота отображается в следующем ряду.

declare @tempProcesstable as table(
    [id] [nvarchar](200) NULL,
    [time_stamp] datetime NULL,
    [AccessType] varchar(3)  NULL) 
insert into @tempProcesstable 

        select distinct t1.emp_Reader_id, t1.DT,t1.eventid from   daily_attendance_data t2 join trnevents t1
on t1.emp_reader_id=t2.emp_reader_id where   (CONVERT(VARCHAR(26), t2.att_Date, 23) >=CONVERT(VARCHAR(26), '2018-10-20', 23) 
                       and CONVERT(VARCHAR(26), t2.att_date, 23) <=CONVERT(VARCHAR(26), '2018-10-21', 23))
                   and
                   (t1.DT >=t2.in_time 
                       and  t1.DT <=t2.out_time)
                        --   and t1.emp_reader_id=1000
                               group by t1.emp_Reader_id,t1.dt,t1.eventid order by t1.emp_reader_id,DT asc
                  ; With CheckIns
As (Select Rowemp_reader_id = Row_Number() Over (Partition by id, Cast(time_stamp As Date) Order By time_stamp),
        id, time_stamp,
        [Date] = Cast(time_stamp As Date),

        [Time] = Cast(time_stamp As Time(0))
    From @tempProcesstable)
Select Pvt.id,B.emp_name ,  [Date], CHECK1, CHECK2,Cast(dateadd(ss,datediff(ss,CHECK1,CHECK2),0) As Time(0)) Total1,
 CHECK3, CHECK4,Cast(dateadd(ss,datediff(ss,CHECK3,CHECK4),0) As Time(0)) Total2
From (Select id, [Date], [Time],
        CHECKNum = 'CHECK' + Cast(Rowemp_reader_id As varchar(11))
    From CheckIns) As P
Pivot (Min([Time])
    For CheckNum In (Check1, [Check2], Check3, Check4)
    ) As Pvt    

     LEFT OUTER JOIN
                      dbo.employee AS B ON Pvt.id= B.emp_reader_id

Мой вывод:

id  emp_name    Date    CHECK1  CHECK2  Total1  CHECK3  CHECK4  Total2  
1048    Singh   2018-10-21  07:06:07    17:34:05    10:27:58    NULL    NULL    NULL    
9999    Test    2018-10-21  08:00:00    NULL    NULL    NULL    NULL    NULL    NULL
9999    Test    2018-10-22  06:00:00    NULL    NULL    NULL    NULL    NULL    NULL

Ожидаемый вывод:

Я хочу все время между временем и временем выходаи ночью и утром тоже.Может ли кто-нибудь помочь мне исправить это.

id  emp_name    Date    CHECK1  CHECK2  Total1  CHECK3  CHECK4  Total2  
1048    Singh   2018-10-21  07:06:07    17:34:05    10:27:58    NULL    NULL    NULL    
9999    Test    2018-10-21  08:00:00    06:00:00    NULL    NULL    NULL    NULL    NULL

1 Ответ

0 голосов
/ 28 октября 2018

Вы можете попробовать использовать ROW_NUMBER() оконную функцию для создания номера строки по каждой дате.

, а затем использовать функцию агрегатирования условий, чтобы сделать сводку

SELECT emp_readr_id,
       emp_name,
       [Date],
       MAX(CASE WHEN RN = 1 THEN time END) CHECK1,
       MAX(CASE WHEN RN = 2 THEN time END) CHECK2,
       MAX(CASE WHEN RN = 3 THEN time END) CHECK3,
       MAX(CASE WHEN RN = 4 THEN time END) CHECK4
FROM (
SELECT emp_readr_id,
       emp_name,
       CONVERT(VARCHAR(10),DT,120) 'Date',
       ROW_NUMBER() OVER(PARTITION BY CONVERT(VARCHAR(10),DT,120) ORDER BY DT) rn,
        CONVERT(VARCHAR(10),DT,108) time
FROM Daily d 
JOIN Trnevents t on t.DT between d.in_time and d.out_time
) t1
group by emp_readr_id,
       emp_name,
       [Date]

sqlifddle

...