首页 > 解决方案 > SQL - GROUP BY - 动态列

问题描述

我们怎样才能做到这一点?

实际表:

.-------.---------.-------.------.---------.
| EmpId | Project | Title | Role |  Values |
|-------|---------|-------|----- |---------|
| 1     | aaa     |xxx    |     A|      100|
| 1     | aaa     |yyy    |     B|      120|
| 1     | aaa     |zzz    |     C|       90|
.-------.---------.-------.------.---------.

目标1:

.-------.---------.-------.----.----.----.
| EmpId | Project | Title | A  | B  | C  |
|-------|---------|-------|--- |----|----|
| 1     | aaa     |xxx    | 100|null|null|
| 1     | aaa     |yyy    |null| 120|null|
| 1     | aaa     |zzz    |null|null|  90|
.-------.---------.-------.----.----.----.

目标 2:

.-------.---------.----.----.----.
| EmpId | Project | A  | B  | C  |
|-------|---------|--- |----|----|
| 1     | aaa     | 100| 120|  90|
.-------.---------.----.----.----.

条件:

  1. 在 Target 1 中,Columns //A是动态生成的。(Pivot-ed,列名的不断变化)。A/B/C 列实际上不是 A/B/C。它是数据透视表或存储过程的结果。它可以是 A/B/C/D 或 M/N 或 X/Y/Z。BC

  2. Title在目标 2 中根本不重要。

标签: sql

解决方案


with cte (id,pro,title,rol,val) as (
select 1,'aaa','xxx','A',100 union all
select 1,'aaa','yyy','B',120 union all
select 1,'aaa','zzz','C',90)
select id,pro,title,[a],[b],[c] from (
select * from cte ) a
pivot 
(max(val) for rol in ([a],[b],[c])) aa


with cte (id,pro,title,rol,val) as (
select 1,'aaa','xxx','A',100 union all
select 1,'aaa','yyy','B',120 union all
select 1,'aaa','zzz','C',90)
select id,pro,max([a]) A,max([b]) B,max([c]) C from (
select * from cte ) a
pivot 
(max(val) for rol in ([a],[b],[c])) aa
group by id,pro

推荐阅读