AdventureWorks2014中按年统计销售总额及客户求和错误排查
T-SQL 需求解决方案:AdventureWorks2014 销售统计问题
问题2:修正指定客户按年份的TotalDue求和错误
先来说你遇到的求和结果不符预期的问题——你的查询里藏了个关键错误:GROUP BY子句中包含了soh.OrderDate,这会让查询按每个具体的订单日期分组,而不是按年份聚合。说白了,你得到的是该客户2011年每一天的销售额,不是全年的总和。
修正后的查询语句
USE AdventureWorks2014 GO SELECT soh.CustomerID ,CONCAT(p.FirstName, ' ', p.LastName) AS [Full Name] ,cr.Name AS Country ,SUM(soh.TotalDue) AS Total_Sales ,YEAR(soh.OrderDate) AS Order_Year FROM Sales.SalesOrderHeader soh JOIN Sales.SalesTerritory st ON soh.TerritoryID = st.TerritoryID JOIN Person.CountryRegion cr ON st.CountryRegionCode = cr.CountryRegionCode JOIN Sales.Customer c ON soh.CustomerID = c.CustomerID JOIN Person.Person p ON c.PersonID = p.BusinessEntityID WHERE YEAR(soh.OrderDate) = 2011 AND soh.CustomerID = 30100 GROUP BY soh.CustomerID ,p.FirstName ,p.LastName ,cr.Name ,YEAR(soh.OrderDate) -- 把具体日期替换成年份,确保分组维度正确
核心修改说明
把GROUP BY里的soh.OrderDate换成YEAR(soh.OrderDate),这样分组逻辑就变成了按年份聚合,SUM函数就能正确计算该客户2011年所有订单的TotalDue总和了。
问题1:统计AdventureWorks2014各年份的销售总额
这个需求很直接,只需要按年份对所有订单的TotalDue求和即可,基础版不需要关联太多表:
基础版:仅年份+年度销售总额
USE AdventureWorks2014 GO SELECT YEAR(OrderDate) AS Order_Year, SUM(TotalDue) AS Annual_Sales_Total FROM Sales.SalesOrderHeader GROUP BY YEAR(OrderDate) ORDER BY Order_Year;
进阶版:按年份+国家/区域统计
如果需要同时查看不同国家的年度销售情况,可以用这个版本:
USE AdventureWorks2014 GO SELECT YEAR(soh.OrderDate) AS Order_Year, cr.Name AS Country, SUM(soh.TotalDue) AS Annual_Sales_Total FROM Sales.SalesOrderHeader soh JOIN Sales.SalesTerritory st ON soh.TerritoryID = st.TerritoryID JOIN Person.CountryRegion cr ON st.CountryRegionCode = cr.CountryRegionCode GROUP BY YEAR(soh.OrderDate), cr.Name ORDER BY Order_Year, Country;
内容的提问来源于stack exchange,提问作者pokoloo213
相关产品推荐
相关产品推荐

