如何用SQL生成含2022全年日期与全产品的销量汇总表?
解决方案:生成2022年全日期-全产品销量汇总表
要实现包含所有2022年日期+全部产品的销量汇总(无销量显示0),核心是先构建「日期-产品」的完整组合,再关联销售数据做聚合。直接用全连接不行的原因是:全连接只能匹配两张表中已有的记录,无法自动生成不存在的日期-产品组合。
具体SQL实现
-- 生成2022年所有日期与所有产品的完整组合,再左连接销售数据计算销量 SELECT dt.Date AS 销售日期, pt.ProductID, pt.ProductName, pt.ProductNumber, -- 用ISNULL将无销量的NULL转为0 ISNULL(SUM(st.Qty_sold), 0) AS 销量 FROM -- 第一步:获取2022年全部日期 Date_Table dt -- 第二步:交叉连接所有产品,生成所有日期-产品的组合 CROSS JOIN Product_table pt -- 第三步:左连接销售表,关联日期和产品ID LEFT JOIN Sales_Table st ON dt.Date = st.Date_of_Sale AND pt.ProductID = st.ProductID -- 筛选2022年的数据 WHERE dt.Year = 2022 -- 按日期和产品分组聚合 GROUP BY dt.Date, pt.ProductID, pt.ProductName, pt.ProductNumber -- 可选:按日期和产品排序 ORDER BY dt.Date, pt.ProductID;
关键逻辑说明
- CROSS JOIN:生成2022年每个日期与每个产品的笛卡尔积,确保所有可能的组合都被包含,这是实现「无销量也显示」的核心。
- LEFT JOIN:保留所有日期-产品组合,即使对应的销售记录不存在。
- ISNULL(SUM(...), 0):聚合时,无销售记录的分组SUM结果为NULL,用ISNULL转换为0,符合需求。
如果你的Date_Table中没有2022年的全部日期,还需要先补全日期数据(比如用递归CTE生成连续日期),再执行上述逻辑。
内容的提问来源于stack exchange,提问作者ProgrammingGirly
相关产品推荐
相关产品推荐

