2012-03-15 10 views
2

私はグループ名の列と費やされる列の列を持っています。 グループ名に基づいて金額グループを合計し、最高5を取得する必要があります。その後、残りの部分をそれ自身のグループにまとめて、合計金額を費やす必要があります。これは今私が持っているものです上位5行を取得して残りのSQL Serverを結合

これらのグループは、それらを注文しますが、私はそれらを組み合わせるために残りのグループをつかむ方法を知りません。どんな助けもありがとう。

答えて

1

私が正しくあなたを理解していた場合、これはそれを行う必要があります:ROW_NUMBER()(SQL Serverを2005+)を使用して

SELECT top 5 groupName, SUM(amount) AS theAmountSpent 
into #tempSpent FROM purchases 
GROUP BY groupName 
ORDER BY theAmountSpent DESC 

Select * from #tempSpent -- get the top 5 

--get sum for the rest 
SELECT SUM(amount) AS theAmountSpent 
FROM purchases 
where groupName not in (select groupName from #tempSpent) 

Drop table #tempSpent 
4

代替CTE-アプローチ:

WITH cte AS (
     SELECT ROW_NUMBER() OVER (ORDER BY (SUM(amount)) DESC) AS num, 
     groupName, SUM(amount) AS theAmountSpent 
     FROM purchases 
     GROUP BY groupName 
    ) 
    SELECT groupName, theAmountSpent FROM cte WHERE num BETWEEN 1 AND 5 --top 5 
    UNION ALL 
    SELECT 'Sum rest', SUM(theAmountSpent) FROM cte WHERE num > 5 -- sum of rest 
+0

これは確かに良いアプローチです – Colin

0

もう一つのアイデアLarstsからコード:

WITH cte 
    AS 
    (
     SELECT case 
       when ROW_NUMBER() OVER (ORDER BY (SUM(amount)) DESC) <=5 
        then ROW_NUMBER() OVER (ORDER BY (SUM(amount)) DESC) 
        else 6 end AS num 
     ,  groupName                
     ,  SUM(amount) AS theAmountSpent 
     FROM purchases 
     GROUP BY groupName 
    ) 
    SELECT num 
    ,  max(groupName) 
    ,  sum(theAmountSpent) 
    FROM cte 
    group by num 
関連する問題