首页 > 解决方案 > 使用 T-SQL 转置两个文本列

问题描述

我可以使用 T-SQL 查询来转置文本数据行吗:

在此处输入图像描述

像这样的列:

在此处输入图像描述

一个人可以参加的培训次数在哪里不同?

标签: tsqlrowtranspose

解决方案


希望这会有所帮助。如果任何 ID 的培训课程超过 3 个,则不会出现多余的培训课程。

SELECT OrgDefinedID
    , max(CASE WHEN row_num = 1 THEN attended END) Attendance1
    , max(CASE WHEN row_num = 1 THEN training END) Training1
    , max(CASE WHEN row_num = 2 THEN attended END) Attendance2
    , max(CASE WHEN row_num = 2 THEN training END) Training2
    , max(CASE WHEN row_num = 3 THEN attended END) Attendance3
    , max(CASE WHEN row_num = 3 THEN training END) Training3

FROM
(SELECT row_number() over (partition by OrgDefinedID order by Attended, Training) as row_num, *  
FROM T1) x 
group by OrgDefinedID

max()做什么?我的第一次尝试是这个

SELECT OrgDefinedID
    , (CASE WHEN row_num = 1 THEN attended END) Attendance1
    , (CASE WHEN row_num = 1 THEN training END) Training1
    , (CASE WHEN row_num = 2 THEN attended END) Attendance2
    , (CASE WHEN row_num = 2 THEN training END) Training2
    , (CASE WHEN row_num = 3 THEN attended END) Attendance3
    , (CASE WHEN row_num = 3 THEN training END) Training3

FROM
(SELECT row_number() over (partition by OrgDefinedID order by Attended, Training) as row_num, *  
FROM T1) x 

几乎就在那里。我们只需要将多行折叠成一行

组织定义 ID 出勤1 培训1 出勤2 培训2 出勤3 培训3
13076 是的 CPIE 在线培训工作室 空值 空值 空值 空值
13076 空值 空值 是的 爱迪 空值 空值
12505478 是的 最佳实践 3,上午 9 点 空值 空值 空值 空值
12505478 空值 空值 是的 更聪明地工作 II,#4 空值 空值
12505478 空值 空值 空值 空值 是的 量规设计 2

您可以看到,在给定的 OrgDefinedID 中,每一列都有一个非空值,而该列中的其他值是空的。因此,如果我们按 OrgDefinedID 分组并应用 max(),它将选择我们想要的非空值。请注意,像 max() 这样的聚合函数会忽略空值。所以添加 max() 函数并按 OrgDefinedID 分组,我们得到:

组织定义 ID 出勤1 培训1 出勤2 培训2 出勤3 培训3
13076 是的 CPIE 在线培训工作室 是的 爱迪 空值 空值
12505478 是的 最佳实践 3,上午 9 点 是的 更聪明地工作 II,#4 是的 量规设计 2

推荐阅读