SQL合并具有特定匹配列的行

时间:2012-07-20 00:38:23

标签: sql join inner-join

我试图在我的代码中处理这个问题,应该在SQL中处理。问题是我想采取这个

ID COL 1 | ID COL 2 |充电|付款

 2    |       3    |    17    |      0
 2    |       3    |    0     |      17

并将其转换为此

ID COL 1 | ID COL 2 |充电|付款

 2    |       3    |    17    |    17

表1

id |不管什么whatever1

5 | null |空

表2

id | id col 1 | id col 2 |充电|付款

5 | 2 | 3 | 17 | 0

5 | 2 | 3 | 0 | 17

目前的结果:

id |不管什么whatever1 | idcol1 | idcol2 |充电|付款

5 | null | null | 2 | 3 | 17 | 0

5 | null | null | 2 | 3 | 0 | 17

想:

id |不管什么whatever1 | idcol1 | idcol2 |充电|付款

5 | 2 | 3 | 17 | 17

问题出在我的SQL调用期间我正在做一个内部联接,它为一些值做笛卡尔积,而不是做我上面想要的。有谁知道如何实现这一目标?

1 个答案:

答案 0 :(得分:2)

您可以使用group by:

select IDCOL1, IDCOL2, max(CHARGE) as charge, max(PAYMENT) as payment
from table t
group by idcol1, idcol2

这会从具有相同ID列的所有行获得最高费用和最高付款。如果您有多行收费或付款,您可能更喜欢SUM()到MAX()。

使用连接,这看起来像:

select t1.id, t1.whatever, t1.whatever, t2.IDCOL1, t2.IDCOL2,
       max(CHARGE) as charge, max(PAYMENT) as payment
from table1 t1 join
     table2 t2
     on t1.id = t2.id
group by t1.id, t1.whatever, t1.whatever, t2.IDCOL1, t2.IDCOL2