如何在一行中的单独行上显示数据

时间:2017-09-12 17:53:14

标签: sql sql-server database tsql datetime

我有一个包含以下设置的表

ID            InOut_Status     InOut_Datetime
1             IN               9/12/2017 8:00
2             IN               9/12/2017 10:00
1             OUT              9/12/2017 1:00
2             OUT              9/12/2017 3:00

我希望能够在同一行上看到状态和日期,而不是单独的行,例如

ID        In_Status    In_Datetime            Out_Status      Out_Datetime
1         IN           9/12/2017 8:00         OUT             9/12/2017 1:00
2         IN           9/12/2017 10:00        OUT             9/12/2017 3:00

我想返回所有列。我只提供了一些例子。我还想仅显示每个Datetime的最新ID,如果用户尚未签出,我希望Out_Datetime为空。

非常感谢任何帮助。感谢。

3 个答案:

答案 0 :(得分:2)

您可以使用自我加入:

SELECT *
FROM
(
SELECT ins.id
  , ins.InOut_Datetime as in_time
  , outs.InOut_Datetime as out_time
  , row_number() over (partition by ins.id order by ins.InOut_Datetime desc) as ranking
FROM table ins
LEFT JOIN table outs
    ON ins.id = outs.id
    AND outs.InOut_Status = 'OUT'
    AND outs.InOut_Datetime > ins.InOut_Datetime
WHERE ins.InOut_Status = 'IN'
and ins.InOut_Datetime >  DATEADD(day, -1, GETDATE())
) t
WHERE t.ranking = 1

更新了查询:

在过去24小时内获取登录信息

仅获取用户的最新登录信息

只有在时间晚于

时才显示时间

答案 1 :(得分:1)

您需要离开连接,但是,您希望使用子查询将连接限制为按降序返回的第一条记录。

    SELECT * FROM
    (
        SELECT
            ID,InOut_Status,InOutDateTime,
            CheckOutInstanceDescending = ROW_NUMBER() OVER(PARTITION BY ClockOut.ID ORDER BY ClockOut.InOutDateTime DESC)
        FROM
            MyTable ClockIn
            LEFT OUTER JOIN MyTable ClockOut ON ClockOut.ID=ClockIn.ID
        WHERE
            ClockIn.InOut_Status='IN'
    )AS Combined
    WHERE
        Combined.CheckOutInstanceDescending=1

答案 2 :(得分:0)

一个简单的数据透镜可以解决这个问题: https://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx。您可以在SSMS 2008或更高版本中运行它(我在SQL 2016中编写)。

DECLARE @Temp TABLE (Id INT, InOut_Status VARCHAR(8), InOut_Datetime DATETIME)

INSERT INTO @Temp (Id, InOut_Status, InOut_Datetime) VALUES (1, 'IN', '9-12-2017 8:00'), (2, 'IN', '9-12-2017 10:00'),(1, 'OUT', '9-12-2017 13:00'),(2, 'OUT', '9-12-2017 16:00'),(3, 'IN', '9-12-2017 06:00')


SELECT
   pvt.Id
, 'IN' AS In_Status
, pvt.[In]
, 'OUT' AS Out_Status
, pvt.OUT
From @Temp
PIVOT(MAX(InOut_Datetime) FOR InOut_Status IN ([In], [OUT])) AS pvt