问题描述
我有 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
。