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

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

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

select top 5 
    columnB, columnA 
from 
    someTable t
order by
    columnA desc
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
0
4 602
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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

Примечание. Я явно не суммировал столбец B, поскольку вы этого не запрашивали.

D'Arcy Rittich 13.12.2008 01:07

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

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

Недавно я часто использовал инструкцию EXCEPT: (Не тестировалось, но я попробую)

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
select top 5 columnB, columnA
from someTable 
order by columnA desc

select SUM(columnA) as Total
from someTable

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

На 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)

Обновлено: Похоже, это сработало после пары глупых синтаксических ошибок. Я исправил их, поэтому теперь он должен работать, как указано выше. Я не могу говорить о производительности на большом наборе данных, но попробовать стоит.

Другие вопросы по теме