0

私はすでに日ごとの内訳であるビューを持っています(以下のクエリの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

このようなものを取得する簡単な方法はありますか?

4

1 に答える 1

3

を使用SUM([Revenue USD])OVER(Partition By [Campaign Name])して、それぞれの合計を取得できますCampaign Name。次に、必要な CTE は 1 つだけです。

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
于 2012-04-18T20:57:13.753 に答える