假设我有一个select函数,它返回以下数据:
select nr, name, val_1, val_2, val_3
from table
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
我想用将行压缩到最小。
我希望得到以下结果:
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
为了压缩最大值为1的行,最大值的分组将有所帮助。
select nr, name, max(val_1), max(val_2), max(val_3)
from table
group by nr, name
但我不确定如何获得Lisa(编号9)的预期结果。Lisa所在的行在"值3"列中包含一个值,在本例中,它被压缩为与编号和名称匹配的第一行,并且在"值3"中包含一个空值。
我感谢每一个输入!
2条答案
按热度按时间c9qzyr3d1#
基本原理与弗拉基米尔的解法相同,这里使用UNPIVOT和PIVOT
vof42yt12#
有一种方法可以做到这一点:为每一列分配一个唯一的行号,方法是按照NULL排在最后的方式对它们进行排序,然后使用这些行号将它们重新连接在一起,并删除所有为NULL的行。
首先只运行CTE,然后检查中间结果以了解其工作原理。
样本数据
查询
结果