对于由于不满足连接条件而未完成总和的所有行,则返回 0



我们试图基于表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(quantity),'0'),但后来意识到这不会将值更新为0,因为SKU的E和F的表A和B之间没有连接。

这可能吗?

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

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;

相关内容

  • 没有找到相关文章

最新更新