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

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

关键说明

  1. 分组逻辑:必须把SELECT里所有非聚合列(CustomerID、FirstName、MiddleName、LastName)都放进GROUP BY,这样才能保证每个客户只返回一行汇总数据
  2. 全名拼接:用CONCAT和ISNULL处理中间名可能为NULL的情况,避免出现多余空格
  3. 金额选择:如果只需要商品本身的总价,可以把TotalDue换成SubTotal;TotalDue是客户实际支付的全部金额,更贴近业务需求

验证视图

创建完成后,执行以下查询确认结果:

SELECT * FROM vTotalWebSalesByCustomer ORDER BY TotalWebSalesAmount DESC;

你会看到每个CustomerID对应唯一一行,包含全名和总网络销售金额。

内容的提问来源于stack exchange,提问作者Emil Grozdanov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:27:39