繁体   English   中英

如何在一行中的不同行上显示数据

[英]How to display data on separate rows in one row

我有一个具有以下设置的表

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

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

任何帮助将不胜感激。 谢谢。

您可以使用自我联接:

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小时内获取登录信息

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

仅显示时间晚于时间

您需要保留联接,但是,您想使用子查询将联接限制为以降序返回的第一条记录。

    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

一个简单的枢轴将最容易地解决此问题: https : //technet.microsoft.com/zh-cn/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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM