我有这样的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
我该如何重写查询?这是你的帮助..
答案 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
它远非最佳,但它有效