You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用SQL生成含指定月份所有日期的员工销售表?

解决指定月份全日期员工销售表生成问题

你遇到的核心问题是关联顺序不对:RIGHT JOIN会以交易表为基准,当某日期无交易时,员工信息没有来源,自然显示NULL。正确的思路是先构建「所有日期 + 所有员工」的完整组合,再左连接交易表,确保无销售日期仍保留员工姓名。

实现步骤与示例代码

假设你有以下基础表:

  • DateTable:存储指定月份的所有日期(如2022-01-01至2022-01-04)
  • EmployeeTable:存储员工信息(包含John等员工)
  • SalesTransaction:存储销售交易记录(仅John在1日、3日有数据)

方案1:使用员工表 + 日期表交叉连接

先通过CROSS JOIN生成每个员工对应所有日期的基础记录,再左连接交易表获取销售金额:

SELECT 
    dt.Date,
    emp.Name,
    st.SaleAmount
FROM 
    DateTable dt
CROSS JOIN 
    EmployeeTable emp
LEFT JOIN 
    SalesTransaction st 
    ON dt.Date = st.TransactionDate 
    AND emp.Name = st.EmployeeName
WHERE 
    dt.Date BETWEEN '2022-01-01' AND '2022-01-04'
ORDER BY 
    dt.Date, emp.Name;

方案2:无单独员工表时,从交易表提取唯一员工

如果没有独立的员工表,可先从交易表中提取所有唯一员工,再和日期表交叉连接:

WITH DistinctEmployees AS (
    SELECT DISTINCT EmployeeName AS Name
    FROM SalesTransaction
)
SELECT 
    dt.Date,
    de.Name,
    st.SaleAmount
FROM 
    DateTable dt
CROSS JOIN 
    DistinctEmployees de
LEFT JOIN 
    SalesTransaction st 
    ON dt.Date = st.TransactionDate 
    AND de.Name = st.EmployeeName
WHERE 
    dt.Date BETWEEN '2022-01-01' AND '2022-01-04'
ORDER BY 
    dt.Date, de.Name;

为什么这个方法有效?

  • CROSS JOIN会生成「日期×员工」的笛卡尔积,确保每个员工在指定范围内的每一天都有一条记录
  • LEFT JOIN交易表时,若该日期-员工无交易,SaleAmount会自动为NULL,但员工姓名始终来自员工表(或提取的唯一员工列表),不会丢失

原RIGHT JOIN的问题

RIGHT JOIN以交易表为基准,当某日期无交易记录时,交易表中没有对应行,员工信息没有来源,因此Name字段会显示NULL,不符合你的需求。

内容的提问来源于stack exchange,提问作者sqlenthusiast

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 02:36:18