对于因未满足连接条件而未完成求和的所有行,返回0

时间:2017-01-03 12:14:25

标签: sql postgresql null aggregate

我们正在尝试基于表B对表A的列进行聚合。我们看到,在连接两个表时,我们只获得满足连接条件的值。但是,对于其他行,该值为null。

表A

SKU | Quantity | Amount  
A   |  
B   |  
C   |  
D   |  
E   |  
F   |  

表B

Order | SKU | Quantity | Amount  
1     | A   | 5        | 50  
2     | B   | 50       | 2000  
3     | C   | 100      | 5000  
4     | D   | 50       | 60  
5     | A   | 20       | 200  
6     | A   | 60       | 600  
7     | B   | 10       | 400

我们想要从表B中计算表A中的数量和数量之和。我们使用以下脚本

UPDATE Table A x 
   SET Quantity = y.qty 
from (
   SELECT SKU, SUM(quantity) AS qty 
   FROM Table B 
   GROUP BY SKU
) AS y 
WHERE x.SKU=y.SKU;

这样做,我们正在

表A

SKU | Quantity | Amount  
A   | 85       |   
B   | 60       | 
C   | 100      |  
D   | 50       |  
E   |          |  
F   |          |

我们希望将E和F更新为0.我们尝试使用Coalesce(SUM(数量),'0')但后来意识到这不会将值更新为0,因为表A和表之间没有连接B对于SKU E& F。

这可能吗?

1 个答案:

答案 0 :(得分:0)

有两种方法可以做到这一点。一种是使用共同相关的子查询:

UPDATE A 
   SET Quantity = (select coalesce(sum(quantity),0) 
                   from b where b.sku = a.sku);

另一种 - 可能更快的方法 - 是在原始查询的派生表中使用外连接:

update a 
   set quantity = y.qty 
from (
   select a.sku, coalesce(sum(b.quantity),0) as qty 
   from a 
     left join b on a.sku = b.sku
   group by a.sku
) as y 
where a.sku = y.sku;