使用 T-SQL 转置两个文本列

Use T-SQL to transpose two text columns

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

像这样的专栏:

每个人可以参加的培训次数各不相同?

希望这对您有所帮助。任何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 

快到了。我们只需要将多行折叠成一行

OrgDefinedID Attendance1 Training1 Attendance2 Training2 Attendance3 Training3
13076 Yes CPIE Online Training Studio null null null null
13076 null null Yes AIDI null null
12505478 Yes Best Practices 3, 9AM null null null null
12505478 null null Yes Work Smarter II, #4 null null
12505478 null null null null Yes Rubric Design 2

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

OrgDefinedID Attendance1 Training1 Attendance2 Training2 Attendance3 Training3
13076 Yes CPIE Online Training Studio Yes AIDI null null
12505478 Yes Best Practices 3, 9AM Yes Work Smarter II, #4 Yes Rubric Design 2