db2 sql左连接表帮助

时间:2011-07-07 11:42:53

标签: sql db2 left-join

我有这样的SQL查询,

    select 
    t1.id as ID,
    case when t2.field1 = 1102 then (t2.field3 - t2.field2) end as A,
    case when t2.field1 = 1112 then (t2.field3 - t2.field2) end as B,
    case when t2.field1 = 1113 then (t2.field3 - t2.field2) end as C,
    case when t2.field1 = 1106 then (t2.field3 - t2.field2) end as D 
   from table1 t1
   left join table2 t2
    on t1.id = t2.id

,结果是这样的;

 ID   A      B     C     D
 ---- ------ ----- ----- ------
 1773 100    NULL  NULL   NULL
 1773 NULL   120   NULL   NULL
 1773 NULL   NULL  200    NULL
 1773 NULL   NULL  NULL   60

但我希望显示这样的结果;

     ID   A      B     C     D
     ---- ------ ----- ----- ------
     1773 100    120   200   60

我该如何重写查询?这是你的帮助..

2 个答案:

答案 0 :(得分:4)

只需使用sum()group by id来展平它:

select 
t1.id as ID,
sum(case when t2.field1 = 1102 then (t2.field3 - t2.field2) end) as A,
sum(case when t2.field1 = 1112 then (t2.field3 - t2.field2) end) as B,
sum(case when t2.field1 = 1113 then (t2.field3 - t2.field2) end) as C,
sum(case when t2.field1 = 1106 then (t2.field3 - t2.field2) end) as D 
from table1 t1
left join table2 t2 on t1.id = t2.id
group by 1;

高效。简单。顺便说一句,max()min()同样可以正常运作。

这是有效的,因为您的数据只有一个场合,每个字段都有一个非空值;任何聚合函数都可以从空值中选择一个值。

答案 1 :(得分:2)

每个值的嵌套查询怎么样?

select t1.id as ID,     
  (select t2.field3 - t2.field2 from table2 t2 
     where t1.id = t2.id and t2.field1 = 1102 ) as A,     
  (select t2.field3 - t2.field2 from table2 t2 
     where t1.id = t2.id and t2.field1 = 1112 ) as B,     
  (select t2.field3 - t2.field2 from table2 t2 
     where t1.id = t2.id and t2.field1 = 1113 ) as C,     
  (select t2.field3 - t2.field2 from table2 t2 
     where t1.id = t2.id and t2.field1 = 1106 ) as D,     
from table1 t1

它远非最佳,但它有效