SQL Server中AventureWorks2014数据库去重求和视图创建求助
解决AdventureWorks2014网络销售客户汇总视图问题
嘿,我来帮你搞定这个问题!你遇到的核心问题是没做好客户维度的分组汇总,或者关联表时产生了重复数据,导致同一个客户出现多行记录。咱们结合AdventureWorks2014的表结构,一步步写出正确的视图代码:
核心思路
需要关联以下3张表来获取所需数据:
Person.Person:获取客户的全名(FirstName + LastName)Sales.Customer:关联客户ID(CustomerID)和人员ID(PersonID)Sales.SalesOrderHeader:筛选网络订单(OnlineOrderFlag = 1),并计算每个客户的总消费金额
正确的视图创建代码
IF OBJECT_ID('vTotalWebSalesByCustomer', 'V') IS NOT NULL DROP VIEW vTotalWebSalesByCustomer; GO CREATE VIEW vTotalWebSalesByCustomer AS SELECT c.CustomerID, -- 拼接客户全名,处理中间名可能为空的情况 CONCAT(p.FirstName, ' ', ISNULL(p.MiddleName + ' ', ''), p.LastName) AS FullName, -- 汇总该客户的所有网络订单总金额,TotalDue包含了订单全部费用(商品+税费+运费) SUM(soh.TotalDue) AS TotalWebSalesAmount FROM Sales.Customer c INNER JOIN Person.Person p ON c.PersonID = p.BusinessEntityID INNER JOIN Sales.SalesOrderHeader soh ON c.CustomerID = soh.CustomerID WHERE soh.OnlineOrderFlag = 1 -- 仅筛选网络销售订单 GROUP BY c.CustomerID, p.FirstName, p.MiddleName, p.LastName -- 按客户唯一标识和姓名分组 GO
关键说明
- 分组逻辑:必须把
SELECT里所有非聚合列(CustomerID、FirstName、MiddleName、LastName)都放进GROUP BY,这样才能保证每个客户只返回一行汇总数据 - 全名拼接:用
CONCAT和ISNULL处理中间名可能为NULL的情况,避免出现多余空格 - 金额选择:如果只需要商品本身的总价,可以把
TotalDue换成SubTotal;TotalDue是客户实际支付的全部金额,更贴近业务需求
验证视图
创建完成后,执行以下查询确认结果:
SELECT * FROM vTotalWebSalesByCustomer ORDER BY TotalWebSalesAmount DESC;
你会看到每个CustomerID对应唯一一行,包含全名和总网络销售金额。
内容的提问来源于stack exchange,提问作者Emil Grozdanov
相关产品推荐
相关产品推荐

