SQL Server 2005 - выберите верхний N плюс «Другое» - PullRequest
1 голос
/ 13 декабря 2008

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

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

select top 5 
    columnB, columnA 
from 
    someTable t
order by
    columnA desc

Ответы [ 5 ]

3 голосов
/ 13 декабря 2008

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

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
1 голос
/ 13 декабря 2008

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 декабря 2008
select top 5 columnB, columnA
from someTable 
order by columnA desc

select SUM(columnA) as Total
from someTable

Выполните вычитание на стороне клиента.

0 голосов
/ 13 декабря 2008

Я недавно много раз использовал 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 голосов
/ 13 декабря 2008

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...