在查询结果中将行放在一起?

时间:2014-01-29 03:42:20

标签: sql oracle group-by

这个小问题正在推动我的问题......我有这张桌子:

ID  N1  N2  N3
----------------------------------------------
1     -     2     -

1     9     -     -

1     -     -     3

2     -     -     2

2     1     -     -

3     -     -     -

3     1     -     3

我想要这个结果:

ID  N1  N2  N3
-----------------------------
1     9     2     3

2     1     -     2

3     1     -     3

我的意思是,我希望根据ID将行放在一起,并在Oracle中保留其他列中不为null的数据...

请帮帮我!我对PL / SQL了解不多,但我想通过使用函数或过程可以找到解决方案。

3 个答案:

答案 0 :(得分:1)

假设那些“ - ”代表null的值,你可以使用FIRST_VALUE分析函数和IGNORE NULLS选项。

示例查询:

select id, 
first_value(n1) ignore nulls over (partition by n1 order by n1) as N1, 
first_value(n2) ignore nulls over (partition by n2 order by n2) as N2, 
first_value(n3) ignore nulls over (partition by n3 order by n3) as N3 
from table;

可以找到有关该功能的更多信息on Oracle Base

答案 1 :(得分:1)

使用min,可以实现

with tab(ID,N1,N2,N3) as (
select 1,NULL,2,NULL from dual union all
select 1,9,NULL,NULL from dual union all
select 1,NULL,NULL,3 from dual union all
select 2,NULL,NULL,2 from dual union all
select 2,1,NULL,NULL from dual union all
select 3,NULL,NULL,NULL from dual union all
select 3,1,NULL,3 from dual)
-----
--End of data
-----
select id, min(n1), min(n2), min(n3) 
  from tab
  group by id

输出

| ID | MIN(N1) | MIN(N2) | MIN(N3) |
|----|---------|---------|---------|
|  1 |       9 |       2 |       3 |
|  2 |       1 |  (null) |       2 |
|  3 |       1 |  (null) |       3 |

答案 2 :(得分:0)

如何使用MINMAXN1(取决于您的要求)对N2N3SELECT id, MIN(n1), MIN(n2), MIN(n3) FROM <table_name> GROUP BY id;

{{1}}