2012-04-18 2 views
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 

이와 비슷한 것을 얻을 수있는 간단한 방법이 있습니까?

답변

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

감사 - 지금 내 쿼리가 상당히 논리적 읽기 –

관련 문제