假设我有一个返回以下数据的选择:
select nr, name, val_1, val_2, val_3
from table
Run Code Online (Sandbox Code Playgroud)
Nr. | Name | Value 1 | Value 2 | Value 3
-----+------------+---------+---------+---------
1 | Max | 123 | NULL | NULL
1 | Max | NULL | 456 | NULL
1 | Max | NULL | NULL | 789
9 | Lisa | 1 | NULL | NULL
9 | Lisa | 3 | NULL | NULL
9 | Lisa | NULL | NULL | Hello
9 | Lisa | 9 | NULL | NULL
Run Code Online (Sandbox Code Playgroud)
我想将行压缩到最低限度。
我想要以下结果:
Nr. | Name | Value 1 | Value 2 | Value 3
-----+------------+---------+---------+---------
1 | Max | 123 | 456 | 789
9 | Lisa | 1 | NULL | Hello
9 | Lisa | 3 | NULL | NULL
9 | Lisa | 9 | NULL | NULL
Run Code Online (Sandbox Code Playgroud)
为了压缩具有 Max (Nr. 1) 的行,对最大值进行分组会有所帮助。
select nr, name, max(val_1), max(val_2), max(val_3)
from table
group by nr, name
Run Code Online (Sandbox Code Playgroud)
但我不确定如何为丽莎(第 9 名)获得所需的结果。Lisa 的行在 Value 3 列中包含一个值,在本示例中,它与与 Nr 和 Name 匹配且在 Value 3 中具有 Null 值的第一行进行压缩。
我感谢每一个投入!
基本原理与弗拉基米尔的解决方案相同。这使用 UNPIVOT 和 PIVOT
with cte as
(
select nr, name, col, val,
rn = row_number() over(partition by nr, name, col order by val)
from [table]
unpivot
(
val
for col in (val_1, val_2, val_3)
) u
)
select *
from (
select nr, name, rn, col, val
from cte
) d
pivot
(
max (val)
for col in ([val_1], [val_2], [val_3])
) p
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
449 次 |
| 最近记录: |