sql-server - 基于地域,获取顶级客户及其总销售额的百分比

标签 sql-server adventureworks

使用 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;

我的输出

My output

输出应该是这样的

The output should look like this

最佳答案

您的查询有一些问题。您需要计算每个地区的总数 - 而不是全部总数。

请注意,下面的代码可以分成单独的语句。此外,还有此任务的其他解决方案。

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;

enter image description here

关于sql-server - 基于地域,获取顶级客户及其总销售额的百分比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51549464/

相关文章:

sql - 附加数据库时权限错误: "Cannot access the specified path"

sql - 将表创建从 MSSQL 转换为 PostgreSQL

asp.net - Northwind 入门套件

sql-server - SQL Server 在列中搜索文本

python - 如何创建没有主键列并避免 Id 默认列的 Django 模型

sql-server - 接受开始日期和从开始日期开始的连续日期数的存储过程

sql - 如何将两个 select 语句合并到一个具有两个单独列的表中?

mysql - 如何组合两个具有来自不同表和多个列的计数的查询

c# - 将 doc 文件插入 SQL Server 中的列