我有两个表“员工主数据”和“销售事实”,其结构如下
员工师傅:
empId | 员工姓名 |
---|---|
1 | 杰克 |
2 | 约翰 |
3 | 卢克 |
销售情况:
empId | 销售日期 | 金额 |
---|---|---|
1 | 2023-10-12 | 100 |
2 | 2023-10-23 | 200 |
1 | 2023-11-12 | 100 |
3 | 2023-11-23 | 200 |
2 | 2023-12-12 | 100 |
3 | 2023-12-23 | 200 |
当我连接这两个表并过滤特定月份时,不会显示该月没有任何销售额的员工。 (例如:当我过滤 2023 年 10 月时,仅显示 1 和 2,当我过滤 2023 年 11 月时,仅显示 1 和 3)
但我的要求是我需要创建一个视图来显示每个月的所有员工,无论他们是否进行了销售。 (例如:当我过滤 2023 年 10 月时,我想要所有 3 名员工,并且 empId 3 的金额应为 NULL)
我当前的解决方案是每月连接这两个表,并将数据插入到一个新表中,该新表有一个额外的 MonthYear 列,这就是我用于过滤器的列。但我必须每月运行一次,这是我想避免的
注意:递归 CTE 在我的 databricks 工作区中不可用
以下是为这些表创建和插入值的代码:
-- Create the table
CREATE TABLE employeeMaster (
empId INT,
empName STRING
);
-- Insert the values into the table
INSERT INTO employees VALUES
(1, 'Jack'),
(2, 'John'),
(3, 'Luke');
-- Create the table
CREATE TABLE sales (
empId INT,
SalesDate DATE,
Amount INT
);
-- Insert the values into the table
INSERT INTO salesFact VALUES
(1, '2023-10-12', 100),
(2, '2023-10-23', 200),
(1, '2023-11-12', 100),
(3, '2023-11-23', 200),
(2, '2023-12-12', 100),
(3, '2023-12-23', 200);
使用子查询返回所有月份,然后交叉联接到员工并左联接到销售:
select
e.empId,
e.empName,
mths.mth,
sum(s.amount) total_amount
from (select distinct date(date_trunc('MONTH', SalesDate)) mth from salesFact) mths
cross join employeeMaster e
left join salesFact s on s.empId = e.empId
and date(date_trunc('MONTH', s.SalesDate)) = mths.mth
group by 1, 2, 3
order by 3, 1
参见现场演示。