2009-10-06 2 views
7

Представьте, что у меня есть таблица, показывающая продажи Acme Widgets и где они были проданы. Довольно легко создать отчет, в котором группируются продажи по странам. Достаточно легко найти топ-10. Но мне хотелось бы показать топ-10, а затем окончательную строку, говорящую «Другой». Например,SQL для производства Top 10 и других

Ctry | Sales 
============= 
GB | 100 
US | 80 
ES | 60 
... 
IT | 10 
Other | 50 

Я искал возрасты, но не могу найти любую помощь, которая берет меня за пределами стандартного верхнего 10.

ТИА

+2

Какой вкус SQL вы используете? Различные продукты будут иметь разные решения – APC

ответ

5

Я попробовал некоторые из другие решения здесь, однако они кажутся либо слегка отключенными, либо порядок не совсем прав.

Моей попытка решения 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) 

Обратите внимания, что в моем примере, я только с помощью TOP 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 

Обратите внимание, что результат запроса правильно упорядочены по совокупной стоимости продаж и не алфавитный код страны, и что категория «Другие» всегда последняя, ​​даже если это совокупная сумма продаж, обычно подталкивает ее к вершине списка.

Я не говорю, что это лучшее (прочитанное: наиболее оптимальное) решение, однако, для набора данных, который я предоставил, кажется, работает очень хорошо.

0

Союза десятки с внешним Присоединитесь к первой десятке, используя таблицу, чтобы собрать все остальное.

У меня нет доступа к SQL здесь, но я Хаззарда догадку:

select top (10) Ctry, sales from table1 
union all 
select 'other', sum(sales) 
from table1 
left outer join (select top (10) Ctry, sales from table1) as table2 
on table2.Ctry = table2.Ctry 
where table2.ctry = null 
group by table1.Ctry 

Конечно, если это быстро меняется топ (10), то вы либо замок или сохранить копию top (10) на время запроса.

0

В псевдо SQL: выбрать топ-10 заказа по продажам UNION выберите 'Other', SUM (продажи), где Ct не в (выбрать топ-10, как выше)

1
SELECT Ctry, sum(Sales) Sales 
FROM (SELECT COALESCE(T2.Ctry, 'OTHER') Ctry, T1.Sales 
     FROM (SELECT Ctry, sum(Sales) Sales 
       FROM Table1 
       GROUP BY Ctry) T1 
      LEFT JOIN 
      (SELECT TOP 10 Ctry, sum(sales) Sales 
       FROM Table1 
       GROUP BY Ctry) T2 
      on T1.Ctry = T2.Ctry 
    ) T 
GROUP BY Ctry 
0

Имейте в виду, что в зависимости от вашего использования (и объема и ограничений базы данных) вы можете достичь тех же результатов, используя код приложения (python, node, C#, java и т. Д.). Sure it will depend on your use-case но эй, это возможно.

Я закончил тем, что делал это в C#, например:

// Mockup Class that has a CATEGORY and it's VOLUME 
class YourModel { string category; double volume; } 


List<YourModel> groupedList = wholeList.Take (5).ToList(); 
groupedList.Add (new YourModel() 
     { 
      category = "Others", 
      volume = tempChartData.Skip (5).Select (t => t.qtd).Sum() 
     }); 

Отказ

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