2012-04-18 5 views
0

私はすでに1日ごとに分割されたビューを持っています(下のクエリのByDay)。グループ化とランキングを組み合わせる正しい方法は何ですか?

今、キャンペーンが収益を生み出しているキャンペーンのトップ10に含まれている場合、結果に行が含まれるようにフィルタリングします。

私は欲しいものを手に入れましたが、私はプロセスでそれを行うために明白な方法をスキップするかもしれないと感じました。

WITH T AS (
    SELECT 
    ByDay.[Day] 
    ,ByDay.[Campaign Name] 
    ,ByDay.[Revenue USD] 
    FROM ByDay 
    WHERE ByDay.[Period]='Mar 2012' 
), 
TT AS (
    SELECT 
    ByDay.[Campaign Name] 
    ,SUM(ByDay.[Revenue USD]) [Sum Revenue USD] 
    FROM ByDay 
    WHERE ByDay.[Period]='Mar 2012' 
    GROUP BY ByDay.[Campaign Name] 
) 
SELECT * FROM (
SELECT 
    T.[Day] 
    ,T.[Campaign Name] 
    ,T.[Revenue USD] 
    ,TT.[Sum Revenue USD] 
    ,DENSE_RANK() OVER(ORDER BY TT.[Sum Revenue USD] DESC) AS R 
    FROM T 
    INNER JOIN TT ON T.[Campaign Name]=TT.[Campaign Name] 
) TTT 
WHERE R < 11 
ORDER BY R 

これほど簡単な方法はありますか?

答えて

3

SUM([Revenue USD])OVER(Partition By [Campaign Name])を使用すると、それぞれCampaign Nameの合計を取得できます。そして、あなたが唯一のCTEを必要とする:大きなヒントについて

http://msdn.microsoft.com/en-us/library/ms189461.aspx

WITH T AS (
    SELECT 
    ByDay.[Day] 
    ,ByDay.[Campaign Name] 
    ,ByDay.[Revenue USD] 
    ,SUM(ByDay.[Revenue USD]) OVER(Partition By ByDay.[Campaign Name]) [Sum Revenue USD] 
    FROM ByDay 
    WHERE ByDay.[Period]='Mar 2012' 
) 
SELECT * FROM (
SELECT 
    T.[Day] 
    ,T.[Campaign Name] 
    ,T.[Revenue USD] 
    ,T.[Sum Revenue USD] 
    ,DENSE_RANK() OVER(ORDER BY T.[Sum Revenue USD] DESC) AS R 
    FROM T 
) TTT 
WHERE R < 11 
ORDER BY R 
+0

おかげで - 今、私のクエリはかなり論理的に読み込み、 –

関連する問題