SQL Oracle将两行合并为一行

时间:2018-04-10 09:28:09

标签: sql oracle merge

我到处寻找,但在这里找不到我的答案。 查询的表格是:

Temptable

id   Value  P   money1    money2     difference
1    B      O   100       null       -100
1    B      S   null      100        100
1    E      O   100       null       -100
1    E      S   null      100        100
1    O      O   100       null       -100
1    O      S   null      100        100
2    B      O   456       null       -456
2    B      S   null      456        456
2    E      O   456       null       -456
2    E      S   null      456        456
2    O      O   456       null       -456
2    O      S   null      456        456

我想要的是将行与相同的ID组合在一起。 所以在查询之后结果应该是:

id   Value  P   money1    money2     difference
1    E      O   100       100        0
1    E      S   100       100        0
1    B      O   100       100        0
1    B      S   100       100        0
1    O      O   100       100        0
1    O      S   100       100        0
2    E      O   456       456        0
2    E      S   456       456        0
2    B      O   456       456        0
2    B      S   456       456        0
2    O      O   456       456        0
2    O      S   456       456        0

因此,如果id 1 money2为null,则该值应填入id为1的地方,其中填写了money2。这是因为我需要记录差异小于1并且表格随值一起提供不同的栏目。

4 个答案:

答案 0 :(得分:2)

我猜你只需要一个小组:

SELECT t.id,
       t.value,
       SUM(money1) AS money1,
       SUM(t.money2)  AS money2,
       SUM(difference) AS difference
  FROM temptable t
 GROUP BY t.id, t.value

编辑:我看到您更改了示例数据。您可以使用分析函数获得新结果:

SELECT t.id,
       t.value,
       t.p,
       SUM(t.money1) OVER (PARTITION BY t.id, t.value) AS money1,
       SUM(t.money2) OVER (PARTITION BY t.id, t.value) AS money2,
       SUM(difference) OVER (PARTITION BY t.id, t.value) AS difference
  FROM temptable t

这样,您将打印所有行

答案 1 :(得分:2)

试试这个:

SELECT id, `value`, SUM(money1) money1, SUM(money2) money2, SUM(difference) difference
FROM Temptable
GROUP BY id, `value`;

答案 2 :(得分:2)

通过sumnvl

的贡献来使用此功能
select max(id) id, value, 
       sum(nvl(money1,0)) money1, sum(nvl(money2,money1)) money2,
       sum(nvl(money2,money1)) - sum(nvl(money1,0)) difference
  from Temptable
 group by id, value;

答案 3 :(得分:1)

我认为你想要的是npm cache clean --force,而不是update,使用MERGECOALESCE

NVL

Demo