gpt4 book ai didi

sql - 在数据透视表的日期时间列上聚合

转载 作者:行者123 更新时间:2023-12-02 08:42:35 25 4
gpt4 key购买 nike

我有一个存储员工登录信息的表

登录表的示例数据是

 EmpID  Status     [Time]
100 SignIn 2013-03-07 11:41:44.473
101 SignIn 2013-03-07 10:41:44.473
100 SignOut 2013-03-07 12:41:44.473
101 SignOut 2013-03-07 11:41:44.473
101 SignIn 2013-03-08 11:41:44.473

我想要的结果是

EmpID   SignIn                    SignOut
100 2013-03-07 11:41:44.473 2013-03-07 12:41:44.473
101 2013-03-07 10:41:44.473 2013-03-07 11:41:44.473
101 2013-03-08 11:41:44.473 NULL

我尝试使用 PIVOT

Select EmpID,[SignIn],[SignOut]
from
(Select EmpId,status,LoginTime from Login)p
pivot
(
min(Logintime)
For status in ([SignIn],[SignOut])
)pvt

但上面的查询遗漏了 Employee 101SignIn Time 但 no SignOut 的最后一行值

SQLFiddle用于生成表格数据

最佳答案

您使用 PIVOT 函数的方法是正确的,您只需要一种根据 empid< 为每一行分配 row_number() 的方法statusdate/您可以使用以下 pivot 代码:

Select EmpID,[SignIn],[SignOut]
from
(
Select EmpId, status,
LoginTime,
cast(logintime as date) date,
row_number() over(partition by empid, status, cast(logintime as date)
order by logintime) rn
from Login
)p
pivot
(
min(Logintime)
For status in ([SignIn],[SignOut])
)pvt

参见 SQL Fiddle with Demo .

您会注意到子查询中有两个新列。一个为每一行生成一个 row_number(),第二个生成没有时间的 date。这两列都在 GROUP BY 中使用,但未显示在最终选择中。使用它们是为了让您每天(如果需要)可以为每位员工获取多行。

使用来自 sql fiddle 的@IvanG 数据的结果是:

| EMPID |              SIGNIN |             SIGNOUT |
-----------------------------------------------------
| 100 | 2013-03-07 11:41:44 | 2013-03-07 12:41:44 |
| 101 | 2013-03-07 10:41:44 | 2013-03-07 11:41:44 |
| 101 | 2013-03-08 11:41:44 | (null) |
| 102 | 2013-04-08 12:41:44 | 2013-04-08 13:41:44 |
| 102 | 2013-04-08 16:41:44 | 2013-04-08 17:41:44 |
| 102 | 2013-04-08 19:41:44 | (null) |

关于sql - 在数据透视表的日期时间列上聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15264563/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com