【问题标题】:Multiple rows with null values - i want one row with not null具有空值的多行 - 我想要一行不为空
【发布时间】:2017-05-05 17:48:53
【问题描述】:

我的查询结果如下:

ID            desc             Year   pid
0006845503    tes1             null   null
0006845503    null             2017   null      
0006845503    null             null    90   
0006845503    null             null    null

我想显示这些结果:

ID              desc               year    pid
0006845503      TEST1              2017    90

【问题讨论】:

    标签: sql oracle select oracle11g


    【解决方案1】:

    如果一列的值只出现一次(只有一个值可用),那么简单的 group by 应该完成任务:

    SELECT t.id,t.year,t.code,MAX(t.desc) as desc,MAX(t.year) as year,MAX(t.pid) as pid
    FROM YourTable t
    GROUP BY t.id,t.year,t.code
    

    【讨论】:

    • 正确的答案,当然...不过仍然很好奇 - 为什么在单个表的查询中需要表别名?
    • 嗯,没有什么特别的原因.. 我发现它更具可读性并且已经成为一种习惯(顺便说一句:)@mathguy
    • ...但没有列别名?在这个非常简单的案例中,它们对我来说比表别名更有意义。
    • 我的习惯是使用表别名。是的,为聚合列设置别名确实更有意义,但我现在才看到它丢失了。
    • :-) 另一个好习惯是不使用 Oracle 保留字作为列名/别名。 DESC 是保留字;如所写,查询将(或应该)抛出错误。 (当然,OP 在原版中有这个,可以向他们指出。)
    【解决方案2】:

    如果您知道每列只有一行有值,您可以使用像 minmax 这样的聚合函数,它会跳过 nulls 并返回列中的唯一值。例如:

    SELECT   id, year, code, MAX("desc"), MAX("year"), MAX(pid)
    FROM     mytable
    GROUP BY id, year, code
    

    【讨论】:

    • 非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    • 2020-01-06
    • 2017-04-07
    相关资源
    最近更新 更多