Я попробовал некоторые другие решения здесь, однако они, кажется, либо слегка отклонены, либо порядок был не совсем правильным.
Моя попытка решения Microsoft SQL Server, похоже, работает правильно:
SELECT Ctry, Sales FROM
(
SELECT TOP 2
Ctry,
SUM(Sales) AS Sales
FROM
Table1
GROUP BY
Ctry
ORDER BY
Sales DESC
) AS Q1
UNION ALL
SELECT
'Other' AS Ctry,
SUM(Sales) AS Sales
FROM
Table1
WHERE
Ctry NOT IN (SELECT TOP 2
Ctry
FROM
Table1
GROUP BY
Ctry
ORDER BY
SUM(Sales) DESC)
Обратите внимание, что в моем примере я использую ТОП 2, а не ТОП 10. Это просто из-за того, что мои тестовые данные более ограничены. Вы можете легко заменить 2 на 10 в ваших собственных данных.
Вот SQL-скрипт для создания таблицы:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Table1](
[Ctry] [varchar](50) NOT NULL,
[Sales] [float] NOT NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
А мои данные выглядят так:
GB 10
GB 21.2
GB 34
GB 16.75
US 10
US 11
US 56.43
FR 18.54
FR 98.58
WE 44.33
WE 11.54
WE 89.21
KR 10
PO 10
DE 10
Обратите внимание, что результат запроса правильно упорядочен по агрегату значений продаж, а не по буквенному коду страны, и что категория "Прочее" всегда является последней, даже если агрегат значений продаж обычно выталкивает его в начало списка. .
Однако я не говорю, что это лучшее (читай: наиболее оптимальное) решение для предоставленного мною набора данных, оно, кажется, работает довольно хорошо.