【问题标题】:SQL Query Problem -- Are Pivots Necessary?SQL 查询问题——是否需要数据透视?
【发布时间】:2011-03-24 08:47:22
【问题描述】:

给定以下数据:

CardholderID   Source                                   DateTime
-------------- ---------------------------------------- -----------------------
3              2nd_Flr_Ramp_Out_Reader                  2010-06-30 13:58:42.410
3              2nd_Flr_Ramp_In_Reader                   2010-06-30 13:44:22.417
3              2nd_Flr_Ramp_Out_Reader                  2010-06-30 13:41:30.510
3              Lobby_To_Office_Reader                   2010-06-30 13:27:51.407
3              2nd_Flr_Ramp_Out_Reader                  2010-06-30 13:27:31.313
3              2nd_Flr_Ramp_In_Reader                   2010-06-30 13:27:23.203
3              2nd_Flr_Ramp_Out_Reader                  2010-06-29 12:03:04.413
3              2nd_Flr_Ramp_In_Reader                   2010-06-29 09:18:16.417
3              2nd_Flr_Ramp_Out_Reader                  2010-06-28 17:51:08.507
3              2nd_Flr_Ramp_In_Reader                   2010-06-28 12:52:28.403
3              2nd_Flr_Ramp_Out_Reader                  2010-06-28 12:04:36.407
3              2nd_Flr_Ramp_In_Reader                   2010-06-28 09:17:20.407
4              1St_Flr_To_Stairs_Reader                 2010-08-02 09:41:14.403
4              1St_Flr_Door_In_Reader                   2010-08-02 09:41:12.403
4              1St_Flr_Door_Out_Reader                  2010-07-30 18:24:36.400
4              1St_Flr_To_Stairs_Reader                 2010-07-30 14:09:54.403
4              1St_Flr_Door_In_Reader                   2010-07-30 14:09:48.403
4              1St_Flr_Door_Out_Reader                  2010-07-30 13:25:24.407

如何按天为每个 cardholderId 获取“In”源的最短时间和“Out”源的最长时间。

我尝试的第一件事是

select CardHolderId, min(DateTime) as EarliestSwipe, null as LatestSwipe
from EventTable
where source like '%In_Reader%'
group by cardholderid, CardHolderFirstName, CardHolderLastName,dateadd(dd, (datediff(dd, 0, DateTime)),0)
union 
select CardHolderId, null as EarliestSwipe, max(DateTime) as LatestSwipe
from EventTable
where source like '%Out_Reader%'
group by cardholderid, CardHolderFirstName, CardHolderLastName, dateadd(dd, (datediff(dd, 0, DateTime)),0)

但我需要将两个查询的结果结合起来。我的问题是,我是否需要对数据进行透视以获得我想要的结果,或者我是否可以保持在我提供的示例的轨道上。我将不胜感激。

【问题讨论】:

  • 作为旁注,您可能希望为 IN/OUT 阅读器添加一列(例如“IsIn”或其他内容的位列),这样您就不会每次都需要进行文本比较运行此查询。

标签: sql-server tsql pivot aggregation


【解决方案1】:

试试这个。

SELECT CardholderID,
    MIN(CASE WHEN source like '%In_Reader%' THEN DateTime ELSE NULL END) as EarliestSwipe,
    MAX(CASE WHEN source like '%Out_Reader%' THEN DateTime ELSE NULL END) as LatestSwipe,
FROM EventTable
GROUP BY CardholderID

我排除了您的其他 GROUP BY 值,但我认为可以添加它们。

【讨论】:

  • 啊,打败我了。请注意,“DateTime”是 SQL 中的保留字,因此,如果您不能重命名该列——并且应该重命名该列,则必须在引用它的任何地方用 [括号]。
  • 在这里击败专家并不容易。 “日期时间”评论的要点。
  • 你太棒了。这正是我所需要的。谢谢。如果我能给你更多的分数,我会的。
  • @SideFX - 我这样做只是为了社区的利益......哈哈,我在打字时什至无法保持正视。 :) 祝你好运。
猜你喜欢
  • 1970-01-01
  • 2016-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多