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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 21:42:45