AdventureWorks2019按年度季度分组汇总销售收入SQL问题
问题原因
你原有语句无法实现季度汇总的核心问题出在GROUP BY逻辑和聚合函数的使用上:
- GROUP BY中包含了
SSOH.[OrderDate](具体到时分秒的订单日期)、SSOD.[LineTotal](单条订单明细的收入)两个细粒度字段,导致每一条订单明细都会单独成为一个分组,自然同季度会出现多条重复维度的数据。 - 没有对收入字段使用聚合函数,直接返回了单条明细的收入值,没有做求和计算。
修改后的完整SQL语句
SELECT SST.[Name] AS RegionName, CASE WHEN SSOH.[OnlineOrderFlag] = 1 THEN 'Online' ELSE 'Reseller' END AS [SalesChannel], YEAR(SSOH.[OrderDate]) AS Year, DATEPART(Quarter, SSOH.[OrderDate]) AS Quarter, SUM(SSOD.[LineTotal]) AS Revenue -- 对同分组下所有明细收入求和 FROM [Sales].[SalesOrderDetail] AS SSOD LEFT JOIN [Sales].[SalesOrderHeader] AS SSOH ON SSOD.[SalesOrderID] = SSOH.[SalesOrderID] -- 提示:如果你没有用到Product表的字段或筛选条件,可以删除下面这行JOIN,提升查询效率 LEFT JOIN [Production].[Product] AS PP ON SSOD.[ProductID] = PP.[ProductID] LEFT JOIN [Sales].[SalesTerritory] AS SST ON SST.TerritoryID = SSOH.TerritoryID WHERE SST.[Name] = 'Australia' AND SSOH.[OnlineOrderFlag] = 1 -- GROUP BY仅保留你需要的分组维度 GROUP BY SST.[Name], SSOH.[OnlineOrderFlag], YEAR(SSOH.[OrderDate]), DATEPART(Quarter, SSOH.[OrderDate])
修改说明
- 收入字段改用
SUM()聚合函数,实现同组所有明细收入的汇总计算 - GROUP BY中移除了细粒度的
OrderDate和LineTotal字段,仅保留区域、销售渠道标记、年份、季度四个分组维度 - 补充了
YEAR(SSOH.[OrderDate])到GROUP BY中,避免不同年份的同季度数据被合并到同一个分组 - SELECT中的销售渠道CASE表达式依赖
OnlineOrderFlag字段,该字段加入GROUP BY后同一分组内值一致,不会产生额外的拆分分组
内容的提问来源于stack exchange,提问作者Archnem
相关产品推荐
相关产品推荐

