2015-12-28 47 views
0

我有这样的一个表:选择客户,每个地区的最高总订单,旁边两个总计

SaleID Region  Customer  OrderAmt 
1   North  Keesha   10 
2   West  Mary   10 
3   North  Winston   10 
4   North  John   10 
5   North  Keesha   10 
6   West  John   10 
7   West  Mary   10 
8   South  John   10 

使用SQL Server 2012中,什么是选择每个地区的最高排序的客户的最佳方式,沿着为客户和区域,即总计:

Region Customer CustAmt RegAmt 
North  Keesha  20  40 
West  Mary  20  30 
South  John  10  10 

尽管多个区域可能包含相同的名称,我们要CustAmt成为总该名称仅在每个区域内,不能跨区域(即,在最后一行,约翰在南部地区的总数是10,n ot 30)。

+0

这个问题并没有表现出任何的研究工作。 –

+0

Awww,苛刻!相信我,我花了数小时的研究,包括在这里和其他地方查看类似的答案。尽管如此,尽管我没有接近解决方案,但不是为了解决没有奏效的问题,而是尽可能地简化和清晰。 – fredolito

回答

2

的CTE:

WITH cte AS (
    SELECT Region, Customer 
     , sum(OrderAmt) AS CustAmt 
     , sum(sum(OrderAmt)) OVER (PARTITION BY Region) AS RegAmt 
     , row_number() OVER (PARTITION BY Region ORDER BY sum(OrderAmt) DESC) AS rn 
    FROM tbl 
    GROUP BY Region, Customer 
    ) 
SELECT Region, Customer, CustAmt, RegAmt 
FROM cte 
WHERE rn = 1; 

或者使用子查询相同:

SELECT Region, Customer, CustAmt, RegAmt 
FROM (
    SELECT Region, Customer 
     , sum(OrderAmt) AS CustAmt 
     , sum(sum(OrderAmt)) OVER (PARTITION BY Region) AS RegAmt 
     , row_number() OVER (PARTITION BY Region ORDER BY sum(OrderAmt) DESC) AS rn 
    FROM tbl 
    GROUP BY Region, Customer 
    ) sub 
WHERE rn = 1; 

关键特性是聚合的窗口函数,所以我们只需要一个单个的 CTE /子查询。

SQL Fiddle.

+0

谢谢!像魅力一样工作。我忽略了在这个问题中提出的问题,并且可能从小样本数据集中看不到,我也想通过RegAmt DESC对结果进行排序。但很容易添加到这些,即使是一个noob。 – fredolito

0

您可以使用多个CTE S和窗口功能:

WITH Cte AS(
    SELECT *, 
     CustAmt = SUM(OrderAmt) OVER(PARTITION BY Customer, Region), 
     RegAmt = SUM(OrderAmt) OVER(PARTITION BY Region) 
    FROM Sales 
), 
CteFinal AS(
    SELECT *, 
     rn = ROW_NUMBER() OVER(PARTITION BY Region ORDER BY CustAmt DESC) 
    FROM Cte 
) 
SELECT 
    Region, Customer, CustAmt, RegAmt 
FROM CteFinal WHERE rn = 1 

SQL Fiddle

1

在一个选择:

select top 1 with ties 
    Region , 
    Customer , 
    CustAmt = sum(OrderAmt), 
    RegAmt = sum(sum(OrderAmt)) over (partition by Region) 
from 
    your_table 
group by  
    Region, 
    Customer 
order by 
    row_number() over(partition by Region order by sum(OrderAmt) desc); 

SQL Fiddle

+0

谢谢!我忽略了在这个问题中提出的问题,并且可能从小样本数据集中看不到,我也想通过RegAmt DESC对结果进行排序。这很有效,但作为一个noob我不理解它,以及Erwin Brandstetter的答案,并增加额外的类型需要更多的思考。 – fredolito

相关问题