需要将列转换为行的 PIVOT 或 CASE 解决方案(如果可能,非动态)

Need PIVOT or CASE solution for converting columns to rows (NON-Dynamic if possible)

所以我有一个 table 有这样的数据:

 SCHD_ID | INST_ID |
|---------|---------|
|    1001 |    Mike |
|    1001 |     Ted |
|    1001 |   Chris |
|    1002 |    Jill |
|    1002 |   Jamie |
|    1003 |    Brad |
|    1003 |    Carl |
|    1003 |    Drew |
|    1003 |    Nick |

我需要提出一个查询来显示如下数据:

|SCHD_ID  | INST 1 | INST 2 | INST 3 |
|---------|--------|--------|--------|
| 1001    | Mike   | Ted    | Chris  |
| 1002    | Jill   | Jamie  | Null   |
| 1003    | Brad   | Carl   | Drew   |

我已经尝试查看所有枢轴描述和一些案例示例,但似乎所有内容都使用一个共同的重复值来进行枢轴旋转。这是列需要动态但仅在一定程度上需要动态的情况之一。我可以在第三位讲师之后删除任何数据。在上面的示例中,我没有为 SCHD_ID 1003 输入 INST 4 的列,即使在我的数据集示例中它存在。添加这样的约束是否可以为 pivot/case 语句提出非动态解决方案?

感谢您的帮助, 德韦恩

您可以使用 row_number() 和条件聚合来做到这一点。但是,您的数据没有排序列,因此您无法保证您将获得哪三位讲师:

select schd_id,
       max(case when seqnum = 1 then inst_id end) as inst1,
       max(case when seqnum = 2 then inst_id end) as inst2,
       max(case when seqnum = 3 then inst_id end) as inst3
from (select t.*,
             row_number() over (partition by schd_id order by sched_id) as seqnum
      from table t
     ) t
group by SCHD_ID ;

如果您对选择讲师有优先顺序,请将逻辑放在 order by 子句中。