即使在加入销售表后应用过滤器,也显示员工主表中的所有行

问题描述 投票:0回答:1

我有两个表“员工主数据”和“销售事实”,其结构如下

员工师傅:

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);
join databricks-sql
1个回答
0
投票

使用子查询返回所有月份,然后交叉联接到员工并左联接到销售:

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

参见现场演示

© www.soinside.com 2019 - 2024. All rights reserved.