SQL Server 2005 - выберите верхний N плюс «Другие»

У меня есть таблица, для которой я хочу выбрать верхнюю часть 5 строк по некоторому столбцу А. Я также хочу иметь шестую строку под названием «Другое», которая суммирует значения в столбце А для всех, кроме 5 верхних строк.

Есть простой способ сделать это? Я начинаю с:

select top 5 
    columnB, columnA 
from 
    someTable t
order by
    columnA desc
12.12.2008 21:59:25
5 ОТВЕТОВ
РЕШЕНИЕ

Не проверено, но попробуйте что-то вроде этого:

select * from (
    select top 5 
        columnB, columnA 
    from 
        someTable t
    order by
        columnA desc
    union all
    select 
        null, sum(columnA) 
    from 
        someTable t
    where primaryKey not in   (
        select top 5 
            primaryKey
        from 
            someTable t
        order by
            columnA desc
    )  
) a
3
12.12.2008 22:04:00
Примечание. Я явно не суммировал columnB, поскольку вы этого не запрашивали.
RedFilter 12.12.2008 22:07:18

Это не в моей голове, и я буду ужасно эффективен:

SELECT TOP 5 columnB, columnA
FROM comTable t
ORDER BY columnA desc

UNION

SELECT 'Other', (A.Sum - B.Sum) AS Summary
FROM (SELECT SUM(columnA) FROM someTable) A
JOIN (SELECT SUM(One) FROM 
    (SELECT TOP 5 columnA FROM someTable ORDER BY columnA DESC)) B
0
12.12.2008 22:06:26

Недавно я много использовал EXCEPT statemnet: (не проверял, но я попробую)

select top 5 
    columnB, columnA 
from 
    someTable t
order by
    columnA desc
UNION ALL
SELECT 'OTHER' ColumnB, SUM(ColumnA)
FROM
(SELECT ColumnB, ColumnA 
FROM someTable t
EXCEPT
select top 5 
    columnB, columnA 
from 
    someTable t
order by
    columnA desc
) others
0
12.12.2008 22:11:08
select top 5 columnB, columnA
from someTable 
order by columnA desc

select SUM(columnA) as Total
from someTable

Делайте вычитание на стороне клиента.

1
12.12.2008 22:17:50

На 100% непроверенный, и с головы до головы, но вы можете попробовать что-то вроде этого. Если у меня будет возможность протестировать сегодня вечером, я обновлю сообщение, но на ужин открыта бутылка вина, и сегодня пятница ... :)

WITH CTE AS
     (
     SELECT
          ColumnB,
          ColumnA,
          ROW_NUMBER() OVER (ORDER BY ColumnB) AS RowNumber
     FROM
          dbo.SomeTable
     )
 SELECT
      CASE WHEN RowNumber <= 5 THEN ColumnB ELSE 'Other' END AS ColumnB,
      SUM(ColumnA) AS ColumnA
 FROM
      CTE
 GROUP BY
      CASE WHEN RowNumber <= 5 THEN ColumnB ELSE 'Other' END
 ORDER BY
      MIN(RowNumber)

РЕДАКТИРОВАТЬ: похоже, это сработало после нескольких глупых синтаксических ошибок. Я исправил их, поэтому теперь это должно работать, как указано выше. Я не могу говорить о производительности на большом наборе данных, но стоит попробовать.

1
13.12.2008 00:17:04