繁体   English   中英

在 SQL 服务器中提出以下 output 的最佳方法是什么?

[英]What is the best approach to comeup with the output below in SQL Server?

在 SQL 服务器中提出以下 output 的最佳方法是什么?

从下面的表 1 中查询并得到类似表 2 的结果。

日期 时间 进出
2022 年 8 月 1 日 0800H
2022 年 8 月 1 日 0802H
2022 年 8 月 1 日 1700H 出去
2022 年 8 月 2 日 0810H
2022 年 8 月 2 日 1700H 出去
2022 年 8 月 3 日 0800H
2022 年 8 月 3 日 1700H 出去
2022 年 8 月 3 日 1710H 出去

后进先出规则

日期 出去
2022 年 8 月 1 日 0802H 1700H
2022 年 8 月 2 日 0810H 1700H
2022 年 8 月 3 日 0800H 1700H

如本图所述原始要求

对于这个集合,可以使用一个简单的CASE语句将INOUT 分开

SELECT [Date]
      , MAX(CASE [IN/OUT] WHEN 'IN' THEN [Time] END) AS [IN]
      , MIN(CASE [IN/OUT] WHEN 'OUT' THEN [Time] END) AS [OUT]
FROM Times
GROUP BY [Date]
ORDER BY [Date]

当条件变得更复杂时,我更喜欢使用 CTE 语法:

WITH TimeData as (
  SELECT [Date],[Time],[IN/OUT]
    , CASE [IN/OUT] WHEN 'IN' THEN [Time] END AS IN_TIME 
    , CASE [IN/OUT] WHEN 'OUT' THEN [Time] END AS OUT_TIME 
  FROM Times
)
 SELECT [Date]
      , MAX(IN_TIME) AS [IN]
      , MIN(OUT_TIME) AS [OUT]
 FROM TimeData
 GROUP BY [Date]
 ORDER BY [Date];

两者都产生相同的结果集:(参见http://sqlfiddle.com/#!18/52750/1

日期 出去
2022-08-01 0802H 1700H
2022-08-02 0810H 1700H
2022-08-03 0800H 1700H

暂无
暂无

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

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