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

时间:2015-09-02 19:09:18

标签: sql oracle pivot case

所以我有一个包含如下数据的表:

 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语句提出非动态解决方案吗?

感谢您的帮助, 德韦恩

1 个答案:

答案 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子句中。