[英]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
语句将IN与OUT 分开:
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.