Изменение строк на столбец в SQL - PullRequest
0 голосов
/ 19 октября 2018

У меня есть следующие данные:

CREATE TABLE TimeLog (
    [User] NVARCHAR(6),
    [Event] NVARCHAR(3),
    [Time] DATETIME
);

INSERT INTO TimeLog VALUES
    (N'Jibran',N'IN','2015-04-15 00:31:00'),
    (N'Jibran',N'IN','2015-04-16 20:10:00'),
    (N'Jibran',N'IN','2015-04-21 14:59:00'),
    (N'Jibran',N'OUT','2015-04-22 01:01:00'),
    (N'Jibran',N'IN','2015-04-22 10:46:00'),
    (N'Jibran',N'OUT','2015-04-23 00:58:00'),
    (N'Jibran',N'IN','2015-04-23 14:50:00'),
    (N'Jibran',N'OUT','2015-04-24 01:37:00')

Я хочу, чтобы у каждого события (для каждого входа / выхода) был новый столбец с пользователем и временем в виде строк.

Ответы [ 2 ]

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

Я предполагаю, что у вас есть последовательные события IN и OUT для каждого пользователя, упорядочите по дате правильно (не так, как в данных вашего примера).

Вы можете использовать ROW_NUMBER для группировки событий IN и OUT в пары, например:

SELECT ROW_NUMBER() OVER (PARTITION BY [User] ORDER BY [Time])  + ROW_NUMBER() OVER (PARTITION BY [User] ORDER BY [Time]) % 2 AS [PairID]
      ,*
FROM [dbo].[TimeLog];

enter image description here

, а затем PIVOT, чтобы получить следующий результат:

SELECT [User]
      ,[IN]
      ,[OUT] 
FROM
(
    SELECT ROW_NUMBER() OVER (PARTITION BY [User] ORDER BY [Time]) + ROW_NUMBER() OVER (PARTITION BY [User] ORDER BY [Time]) % 2 AS [PairID]
          ,*
    FROM [dbo].[TimeLog]
) DS
PIVOT
(
    MAX([Time]) FOR [Event] IN ([IN], [OUT])
) PVT
ORDER BY [PairID];

enter image description here

Примечание. Я изменил одно из ваших IN событийдо OUT для очистки данных.Если это не правильно в вашем реальном примере, я думаю, вы все еще можете использовать логику выше.Например, с вашими примерами данных получено максимальное событие IN, которое не имеет события OUT:

enter image description here

Вы можете играть сизмените код MAX на MIN или дополните его своей бизнес-логикой.

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

использовать агрегатную функцию с регистром

select user, max(case when Event='IN' then DATETIME end) as IN_time,
max(case when Event='OUT' then DATETIME end) as Out_time from t
group by user
...