首页 > 解决方案 > 如何与不同的列和空行联合

问题描述

我正在尝试获取 SQL Server 中的人员状态列表。

每天有人打卡时都会添加新记录,因此当天不存在行,但是在表历史记录中将至少有一条该人打卡的记录。

示例数据

| Name | Status | Date                    |   
|------+--------+-------------------------|  
| Joe  | In     | 2019-09-03 07:56:00.000 |
| Jack | In     | 2019-09-03 06:52:00.000 |
| Joe  | In     | 2019-08-21 07:02:00.000 |
| Jack | In     | 2019-08-14 06:09:00.000 |
| Jane | In     | 2019-08-15 07:38:00.000 |

示例 SQL

select name, status
from timeclock
where clockInTime >= dateAdd(day, 0, dateDiff(day, 0, current_timestamp))

union

select name, status
from timeclock
where not exists (?)

第一个选择将包含 Joe 和 Jack,因为他们在过去 24 小时内打卡。

预期产出

| Name | Status |   
|------+--------+    
| Joe  | In     |  
| Jack | In     |  
| Jane | Out    |  

我如何也只选择每个成员一次(不同),但将 Jane 的状态设为 out?

标签: sql-serverunion

解决方案


这听起来像你想要的更多是这样的:

SELECT [Name],
       CASE WHEN COUNT(CASE WHEN clockInTime >= dateAdd(day, 0, dateDiff(day, 0, current_timestamp)) THEN 1 END) > 0 THEN 'In' ELSE 'OUT' END AS [Status]
FROM timeclock
GROUP BY [Name];

这使用条件聚合,并且只计算时间之后的行数。


推荐阅读