I already have a view which is a break down by day (ByDay in query below).
Now I want to filter it such that a row is included in the result if it’s campaign is in the top 10 revenue generating campaigns.
I got what I wanted but I have a feeling I might skipped over the obvious/right way to do it in the process.
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
Is there a simpler way to get something like this?
You could use
SUM([Revenue USD])OVER(Partition By [Campaign Name])to get the sum for eachCampaign Name. Then you only need one CTE:http://msdn.microsoft.com/en-us/library/ms189461.aspx