sql - 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|
.-------.---------.----.----.----.
条件:
在 Target 1 中,Columns //
A
是动态生成的。(Pivot-ed,列名的不断变化)。A/B/C 列实际上不是 A/B/C。它是数据透视表或存储过程的结果。它可以是 A/B/C/D 或 M/N 或 X/Y/Z。B
C
列
Title
在目标 2 中根本不重要。
解决方案
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
推荐阅读
- python-3.x - 通过WSL在pycharm中配置git
- c - 如果这是一个数组还是一个整数,有没有办法在编译时知道(并且不会失败)?
- sql - 过程错误:无法将“System.DBNull”类型的对象转换为“System.String”类型
- java - 如何使用 JNI 在 Android 中包含不可修改的原生 C++?
- c# - 请求被中止:无法使用 Restsharp 创建 SSL/TLS 安全通道
- javascript - 相同的索引在循环中给出不同的 DOM 元素
- node.js - async/await 是否以不同的方式处理未捕获的拒绝错误?
- python - 如何在 Google Playground 协作中使用 EndlessGPT2.py
- random-forest - 避免过度拟合随机森林
- javascript - 附加后隐藏和显示按钮不起作用