即使不存在数据,也显示每个分区的所有类别

问题描述

我有 2 个表,其中一个显示每个日期、商店、类型和产品的一些值,如下所示(这已经是 GROUP BY 日期、商店、类型、产品):

表 1:

日期 商店 类型 产品 价值观 ...
7/1 s1 A 1 ...
7/1 s1 A b 2 ...
7/2 s1 B d 3 ...
7/2 s2 A c 4 ...

第二个是所有可能的类型和产品的列表:

表 2:

类型 产品
A
A b
A c
B d

现在我想加入这两个表来显示每个日期和商店的所有可能的类型/产品,所以结果是:

日期 商店 类型 产品 价值观 ...
7/1 s1 A 1 ...
7/1 s1 A b 2 ...
7/1 s1 A c 0 ...
7/1 s1 B d 0 ...
7/2 s1 A 0 ...
7/2 s1 A b 0 ...
7/2 s1 A c 0 ...
7/2 s1 B d 3 ...
7/2 s1 A 0 ...
7/2 s1 A b 0 ...
7/2 s2 A c 4 ...
7/2 s1 B d 0 ...

我尝试过左连接:

SELECT t1.date,t1.store. t1.values,t2.type,t2.product
FROM t2 
LEFT JOIN t1 ON t1.type = t2.type,t1.product = t2.product

但这并没有给我预期的输出,它只有在一种类型根本不在 t1 中时才有效。

这样做的正确方法是什么?

解决方法

此查询显示 (type,product)tbl2 的所有组合,用于 (date,store)tbl1 的所有组合:

SELECT ds.*,t2.*,t1.value
FROM  (
   SELECT date,store
   FROM   tbl1
   GROUP  BY date,store
   ) AS ds
CROSS  JOIN tbl2 AS t2
LEFT   JOIN tbl1 AS t1 USING (date,store,type,product);

或者,您可以将子查询 ds 替换为

的完整组合集

30 天数据和 10 家商店

(就像 tbl1 不包含所有组合的数据。)

如果在 value 中没有找到行,

tbl1 将为 NULL。您可以使用 COALESCE(t1.value,0) 来代替 0