2015-12-28 62 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

相關問題