首页 > 解决方案 > 从垂直行中选择记录并转换水平行

问题描述

我正在处理 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

标签: sqlsql-servertsqlsql-server-2012

解决方案


只需通过将行聚合到所需级别 ( 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

推荐阅读