所以我有一个包含如下数据的表:
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语句提出非动态解决方案吗?
感谢您的帮助, 德韦恩
答案 0 :(得分:2)
您可以使用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
子句中。