У меня есть таблица, для которой я хочу выбрать верхние 5 строк по некоторому столбцу A. Я также хочу иметь 6-ю строку под названием «Другое», которая суммирует значения в столбце A для всех, кроме первых 5 строк.
Есть простой способ сделать это? Я начинаю с:
select top 5
columnB, columnA
from
someTable t
order by
columnA desc


Не проверял, но попробуйте что-то вроде этого:
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
Это не в моей голове, и я гарантирую ужасную эффективность:
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)
Обновлено: Похоже, это сработало после пары глупых синтаксических ошибок. Я исправил их, поэтому теперь он должен работать, как указано выше. Я не могу говорить о производительности на большом наборе данных, но попробовать стоит.
Примечание. Я явно не суммировал столбец B, поскольку вы этого не запрашивали.