2017-07-03 6 views
1

'& Product'の組み合わせでトップセールスを選択します。 第一Iソート&ランク、私は「場所&製品」、そして私は、このようなクエリの結果が「場所&製品」のみでトップセールスマンが含まれていることにより、「場所&製品を」トップセールスの人が、すべてをドロップしたいため合計それぞれの「Location & Product」の組み合わせの合計売上が計算されます。あなたはサブクエリを使用することができます- select文中にフィルタを含める方法b4 from句

Select Location, Product, Sales, Salesperson 
     row_number() OVER (PARTITION BY concat(Location,Product) ORDER BY Sales desc) AS Rank, 
     Sum(Sales) OVER(PARTITION BY concat(Location,Product)) AS Salesbylocprod 
From Table A 
+0

あなたは、サブクエリであなたの現在のクエリを入れ、その後、ランク= 1(例えば、 '選択*(私の現在のクエリーからそのサブクエリから値のみを選択します)をtとするとrank = 1; ')となる。補足として、 'PARTITION BY'節で' CONCAT'を使うことは不要です。とにかく同じ結果のために両方の列でパーティション化することができます(また、2つの異なる場所と製品の連結が同じであるという独自のシナリオでは、そのシナリオを避けることができます)。 – ZLK

答えて

0

:動作しない「から」後「どこ」句を追加する - 私が持っていない

1つの部分は、「ランク= 1を選択する」です。また、あなたはpartition byのためのキーを連結する必要はありません。私はseqnumrankから列の名前を変更し

Select Location, Product, Sales, Salesperson, Salesbylocprod 
from (select a.* 
      row_number() over (partition by Location, Product order by Sales desc) as seqnum, 
      sum(Sales) over (partition by Location, Product) as Salesbylocprod 
     From Table A 
    ) a 
where seqnum = 1; 

注意を。 rankは、rank()関数を使用して計算されたことを暗示します。それはrow_number()とは異なりますので、その名前は誤解を招きます。

+0

@Viking this works - ありがとう! – texastonie

0

また、共通テーブル式を使用することができます。

;WITH CTE 
    AS (SELECT *, 
       ROW_NUMBER() OVER(PARTITION BY Location,Product ORDER BY Sales DESC) AS RowNum, 
       SUM(Sales) OVER(PARTITION BY Location,Product) AS SalesByLocProd 
     FROM TableA 
     ) 
     SELECT Location, 
      Product, 
      Sales, 
      SalesPerson, 
      SalesByLocProd 
     FROM CTE 
     WHERE RowNum = 1;