通过用0s-postgresql填充一个表,确保第1列的每个不同值都有一行包含第2列的每个不相同值



下面是我为说明我想要实现的目标而制作的一个粗略示例:

表1:

| Shop | Product | QuantityInStock | 
| a    | Prod1   | 13              | 
| a    | Prod3   | 13              | 
| b    | Prod2   | 13              | 
| b    | Prod3   | 13              | 
| b    | Prod4   | 13              | 

表1变为:

| Shop | Product | QuantityInStock | 
| a    | Prod1   |   13            | 
| a    | Prod2   |    0            | -- new 
| a    | Prod3   |   13            | 
| a    | Prod4   |    0            | -- new 
| b    | Prod1   |    0            | -- new 
| b    | Prod2   |   13            | 
| b    | Prod3   |   13            | 
| b    | Prod4   |   13            | 

在这个例子中,我想表示每个商店/产品组合

每个商店{a,b}与每个产品{Prod1,Prod2,Prod3,Prod4}有一行

QuantityInStock=13没有意义,我只是想要一个占位符编号:(

使用日历表交叉联接方法:

SELECT s.Shop, p.Product, COALESCE(t1.QuantityInStock, 0) AS QuantityInStock
FROM (SELECT DISTINCT Shop FROM table1) s
CROSS JOIN (SELECT DISTINCT Product FROM table1) p
LEFT JOIN table1 t1
ON t1.Shop = s.Shop AND
t1.Product = p.Product
ORDER BY
s.Shop,
p.Product;

这里的想法是通过交叉连接生成一个包含所有商店/产品组合的中间表。然后,我们将其加入table1。任何在实际表格中匹配的商店/产品组合都被分配为零库存数量。

最新更新