不使用分组依据压缩或合并具有空值的行

lec*_*rio 3 sql sql-server

假设我有一个返回以下数据的选择:

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 值的第一行进行压缩。

我感谢每一个投入!

Squ*_*rel 5

基本原理与弗拉基米尔的解决方案相同。这使用 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)