sql - 从垂直行中选择记录并转换水平行
问题描述
我正在处理 SQL Server 查询以获取将处理多个任务代码的用户列表的最后一个 Badge_In_Out_Time。
task_mgmt - 表名
表列如下
任务_Sn | 用户名 | 任务代码 | 行动 | 徽章_IN_OUT_TIME |
---|---|---|---|---|
1 | 安迪 | 博客 | 开始 | 2021-07-15 08:11:45.000 |
2 | 安迪 | 博客 | 结尾 | 2021-07-15 10:11:45.000 |
3 | 贝基 | ACCTS | 开始 | 2021-07-15 11:11:45.000 |
4 | 克里斯 | 税 | 开始 | 2021-07-15 12:11:45.000 |
5 | 安迪 | 社交媒体 | 开始 | 2021-07-15 12:15:45.000 |
6 | 贝基 | ACCTS | 结尾 | 2021-07-15 12:25:45.000 |
我排除了结果
用户名 | 任务代码 | 徽章_IN_TIME | 徽章_OUT_TIME |
---|---|---|---|
安迪 | 博客 | 2021-07-15 08:11:45.000 | 2021-07-15 10:11:45.000 |
贝基 | ACCTS | 2021-07-15 11:11:45.000 | 2021-07-15 12:25:45.000 |
克里斯 | 税 | 2021-07-15 12:11:45.000 | |
安迪 | 社交媒体 | 2021-07-15 12:15:45.000 |
我真的无法对此提出任何疑问。我是 SQL 的初学者,我知道 CRUD 操作。这对我来说似乎超级复杂。
Select UserName,
Task_Code,
Badge_In_Time,
Badge_Out_Time
from task_mgmt
order by Badge_IN_OUT_TIME desc
解决方案
只需通过将行聚合到所需级别 ( UserName
, TaskCode
) 进行简单的旋转,然后使用MAX
或旋转MIN(CASE WHEN .... END)
像这样:
SELECT
tm.UserName
,tm.Task_Code
,MIN(CASE WHEN tm.Action = 'START' THEN tm.Badge_IN_OUT_TIME ELSE NULL END) AS Badge_IN_TIME
,MAX(CASE WHEN tm.Action = 'END' THEN tm.Badge_IN_OUT_TIME ELSE NULL END) AS Badge_OUT_TIME
FROM
task_mgmt AS tm
GROUP BY
tm.UserName
,tm.Task_Code
推荐阅读
- azure - 如何在 Azure 搜索中获取非文本字段的 PII 实体
- c# - 当行为空白时如何停止foreach循环
- python - 不使用 beautifulsoup 抓取网站数据
- mysql - 如何同步两个不同数据库中的两个表 PhpMyAdmin
- r - 使用转置传播数据帧
- function - 如何从 Kotlin 中的函数返回具有不同类型的多个值(其中一个是数据类)?
- firebase - 我怎样才能从一个特定的只获取一个字段
- angular - PIXI.js:不在每一帧重新创建完整场景的代码架构
- r - 当同一天有多个条目时,查找分组计数的每日平均值
- objective-c - 在未初始化的实例变量上使用 @synchronized 是否安全?