同比季度销售数据对比SQL查询结果异常问题求助
问题排查与解决步骤
一、关联逻辑问题修正
1. 检查CTE的聚合完整性
你的两个CTE必须按ProductID做分组聚合,确保每个ProductID只返回一行销售数据,否则FULL JOIN时会因重复行产生笛卡尔积,导致多余结果。示例正确CTE结构:
WITH orders_cy AS ( SELECT p.ProductID, SUM(sod.OrderQty) AS FQSalesCY FROM SalesLT.SalesOrderDetail sod JOIN SalesLT.Product p ON sod.ProductID = p.ProductID JOIN SalesLT.ProductCategory pc ON p.ProductCategoryID = pc.ProductCategoryID WHERE pc.ProductCategoryID = 5 -- 替换为实际当前季度的日期过滤,比如2024年Q1: AND YEAR(sod.ModifiedDate) = 2024 AND DATEPART(QUARTER, sod.ModifiedDate) = 1 GROUP BY p.ProductID ), orders_ly AS ( SELECT p.ProductID, SUM(sod.OrderQty) AS FQSalesLY FROM SalesLT.SalesOrderDetail sod JOIN SalesLT.Product p ON sod.ProductID = p.ProductID JOIN SalesLT.ProductCategory pc ON p.ProductCategoryID = pc.ProductCategoryID WHERE pc.ProductCategoryID = 5 -- 对应去年同季度,比如2023年Q1: AND YEAR(sod.ModifiedDate) = 2023 AND DATEPART(QUARTER, sod.ModifiedDate) = 1 GROUP BY p.ProductID )
2. 修正FULL JOIN关联逻辑
必须以ProductID作为唯一关联键,同时用COALESCE和ISNULL处理单侧无数据的情况,避免NULL干扰,且不要额外加聚合(否则会出现多余总计行):
SELECT COALESCE(cy.ProductID, ly.ProductID) AS ProductID, ISNULL(cy.FQSalesCY, 0) AS FQSalesCY, ISNULL(ly.FQSalesLY, 0) AS FQSalesLY FROM orders_cy cy FULL JOIN orders_ly ly ON cy.ProductID = ly.ProductID ORDER BY ProductID;
3. 验证日期过滤准确性
FQSalesLY无预期值,大概率是去年同季度的日期范围写错了。比如当前是2024年Q2,去年Q2必须是2023年4-6月,不要用YEAR(GETDATE())-1但季度不匹配的情况(比如当前是12月Q4,去年Q4是去年10-12月,要确保DATEPART(QUARTER)一致)。
二、快速格式化表格的方法
- Excel转Markdown:把SQL查询结果复制到Excel,选中数据(含表头),在旁边列用公式生成Markdown格式行:
比如第一列是A1,第二列B1,第三列C1,在D1输入:="|"&A1&"|"&B1&"|"&C1&"|",下拉填充后复制D列内容,再插入表头分隔线|---|---|---|即可。 - 编辑器一键格式化:用VS Code的「Markdown All in One」插件,选中带表头的表格数据,按
Ctrl+Shift+P输入「Markdown: Format Table」即可自动生成规范的Markdown表格;Notion中直接粘贴表格数据,自动识别后可导出为Markdown格式。 - SQL工具直接复制:SSMS中选择「Results to Grid」,查询结果右键选「Copy with Headers」,粘贴到支持Markdown的编辑器(如Obsidian、VS Code),多数编辑器会自动转换为Markdown表格。
内容的提问来源于stack exchange,提问作者Meditation
相关产品推荐
相关产品推荐

