2011-07-07 136 views
1

我有一个SQL查询这个样子,DB2 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 

我该如何重写查询? thx为您的帮助..

+0

是否所有的行都有相同的ID? –

+0

是的,所有行都有相同的ID – vtokmak

回答

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()可以很好地工作。

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

+0

+1。我同意你的意见 – niktrs

+0

thx为你的帮助,它的工作;) – vtokmak

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 

这是远远没有达到最佳,但它的工作原理

+0

thx为您提供帮助,您的代码也可以正常工作;) – vtokmak