假设我有一个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

对于用Max(第1名)压缩行,使用最大值的group by会很有帮助.

select nr, name, max(val_1), max(val_2), max(val_3) 
from table 
group by nr, name 

但我不确定如何才能得到丽莎想要的结果(第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

Sql相关问答推荐

为什么Postgrs Planner会在输出部分中显示我在查询中不使用的列?'""

基于列对多行求和的查询

GROUP BY与多个嵌套查询T—SQL

Postgres JSONB对象筛选

删除MariaDB数据库中的JSON数据

NULL-生成的列中连接的字符串的输入

使用列表作为参数进行 Select ,如果为空,则在PostgreSQL中不使用参数进行 Select

我可以在SQLite3中使用BLOB作为主键吗?

如何找到一个组合的两个列,这是不是在其他表在ORACLE SQL?

用VB.NET在Dapper中实现MS Access数据库顺序透视

确定小数中使用的精度位数

如何在 postgres 中旋转某些数据字段

带有数组输入参数的Snowflake UDF优化

带聚合函数的 percentile_cont

为重复的项目编号显示正在处理

计算 PostgreSQL 中的平均会话长度

根据开始/结束标记将 GROUP_ID 分配给行

SQL 计数和过滤查询优化

如何在 Oracle 中获取此变量的值?

如何比较同一张表中的行并进行相应更新