使用 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
我可以使用 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 |