Возьмите 5 лучших строк и объедините остальные SQL Server - PullRequest
2 голосов
/ 16 марта 2012

У меня есть столбец для имени группы и столбец для потраченной суммы. Мне нужно сложить суммы группировать их по названию группы, а затем взять наибольшую пятерку. После этого мне нужно объединить остальные в свою группу с общей суммой потраченных средств. Это то, что у меня сейчас

SELECT groupName, SUM(amount) AS theAmountSpent
FROM purchases
GROUP BY groupName
ORDER BY theAmountSpent DESC

Это группирует и упорядочивает их, но я не знаю, как затем захватить оставшиеся группы, чтобы объединить их. Любая помощь будет оценена.

Ответы [ 3 ]

4 голосов
/ 16 марта 2012

Альтернативный подход CTE с использованием row_number () (SQL Server 2005 +):

    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
1 голос
/ 16 марта 2012

Если я вас правильно понимаю, это должно сделать:

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
0 голосов
/ 22 ноября 2017

Еще одна идея из кода Ларста:

    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
...