sql-server - 根据区域,获取顶级客户及其总销售额百分比
问题描述
使用 Adventureworks 数据库。
我被困在该地区的前 5 名客户中。我们怎样才能得到给定格式的输出呢?
SELECT TOP 5 CustomerID
,oh.TerritoryID
,Name
,SUM(TotalDue) / (
SELECT SUM(TotalDue)
FROM Sales.SalesOrderHeader
) * 100 AS [%_of_TotalSale]
FROM Sales.SalesOrderHeader oh
INNER JOIN Sales.SalesTerritory st ON st.TerritoryID = oh.TerritoryID
GROUP BY oh.TerritoryID
,CustomerID
,Name
ORDER BY [%_of_TotalSale] DESC;
我的输出
输出应如下所示
解决方案
您的查询有一些问题。您需要计算每个地区的总数 - 而不是整个总数。
请注意,下面的代码可以分成单独的语句。此外,此任务还有其他解决方案。
WITH DataSource AS
(
SELECT DISTINCT TerritoryID
,CustomerID
,SUM(TotalDue) OVER (PARTITION BY TerritoryID,CustomerID) * 100 / SUM(TotalDue) OVER (PARTITION BY TerritoryID) AS [%_of_TotalSale]
FROM Sales.SalesOrderHeader
), DataSourceUsersRanked AS
(
SELECT *
,ROW_NUMBER() OVER (PARTITION BY TerritoryID ORDER BY [%_of_TotalSale] DESC) AS RN
FROM DataSource
), DataSourceUsersFiletred AS
(
SELECT *
FROM DataSourceUsersRanked
WHERE RN <= 5
)
SELECT DSF.TerritoryID
,st.[Name]
,SUM([%_of_TotalSale]) AS [%_of_TotalSale]
,MAX(UserIDs) AS [Top5Customers]
FROM DataSourceUsersFiletred DSF
INNER JOIN Sales.SalesTerritory st
ON DSF.TerritoryID = st.TerritoryID
CROSS APPLY
(
SELECT STUFF
(
(
SELECT ',' + CAST(CustomerID AS VARCHAR(12))
FROM DataSourceUsersFiletred DS1
WHERE DS1.[TerritoryID] = DSF.[TerritoryID]
ORDER BY CustomerID
FOR XML PATH(''), TYPE
).value('.', 'VARCHAR(MAX)')
,1
,1
,''
)
) Users(UserIDs)
GROUP BY DSF.TerritoryID
,st.[Name]
ORDER BY TerritoryID;
推荐阅读
- c# - c#sharp proejct .net 4.5依赖,应该与一个天蓝色的消息队列交互
- android - android studio 模拟器:警告:UpdateCheck:失败:没有错误
- angular - Angular 4阻止组件重新加载
- python - Python 3 字节在 CGI 脚本中使用非 ascii 字符解码
- python - Python - 程序可以在 Linux 中运行,但不能在 Windows 中运行
- jsp - 如何使用 Java Struts 1 框架防止持久性 XSS 漏洞?
- authentication - 如何在我的 Web api 上将身份验证类型更改为电话号码而不是用户名?
- javafx - 如何使用浅色为 JavaFX 背景渐变设置动画
- python - 从深度遍历嵌套字典并移动到顶部
- postgresql - 如何映射主机上已存在的 Docker 容器中定义的用户权限