2009-10-06 13 views
7

Wyobraź sobie, że mam tabelę pokazującą sprzedaż Acme Widgets, i gdzie zostały sprzedane. Dość łatwo jest wygenerować raport grupujący sprzedaż według kraju. Dosyć łatwo jest znaleźć top 10. Ale chciałbym pokazać 10 najlepszych, a następnie ostatni wiersz z napisem Other. NpSQL do produkcji Top 10 i innych

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

Szukałem od dawna, ale nie wydaje się znaleźć żadnej pomocy, która zabiera mnie poza standardową top 10.

TIA

+2

Który smak SQL używasz? Różne produkty będą miały różne rozwiązania – APC

Odpowiedz

5

Próbowałem niektóre z inne rozwiązania tutaj, jednak wydaje się, że są albo lekko wyłączone, albo zamówienie nie było w porządku.

Moja próba rozwiązania Microsoft SQL Server wydaje się działać poprawnie:

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) 

pamiętać, że w moim przykładzie, ja tylko używam Top 2 zamiast TOP 10. Jest to po prostu ze względu na mój danych testowych jest raczej bardziej ograniczony. Możesz łatwo zastąpić 2 za 10 we własnych danych.

Oto skryptu SQL do tworzenia tabeli:

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 

I moje dane wygląda następująco:

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 

Zauważ, że wynik zapytania jest prawidłowo uporządkowane według łącznej wartości sprzedaży, a nie alfabetyczny kod kraju, a kategoria "Inne" jest zawsze ostatnia, nawet jeśli jest to agregat wartości Sprzedaży zwykle popycha go na początek listy.

Nie twierdzę, że jest to najlepsze (czytaj: najbardziej optymalne) rozwiązanie, jednak dla zestawu danych, który dostarczyłem, wydaje się działać całkiem dobrze.

0

Unii dziesięciu najlepszych z zewnętrznym Dołącz do pierwszej dziesiątki, korzystając ze stołu, aby zebrać resztę.

nie mam dostępu do SQL tutaj ale ja Hazzard przypuszczenie:

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 

oczywiście jeśli jest to szybko zmieniających się górny (10), to albo blokada lub utrzymywać kopię top (10) na czas trwania zapytania.

0

W pseudo SQL: wybrać 10 najlepszych zamówienie sprzedaży UNION wybrać 'Inne' SUM (sprzedaży), gdzie CTRY nie (select top 10 jak powyżej)

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

Należy pamiętać, że w zależności od zastosowania (oraz objętości/ograniczeń bazy danych) można uzyskać takie same wyniki przy użyciu kodu aplikacji (python, węzeł, C#, java itp.). Sure it will depend on your use-case ale hej, to możliwe.

skończyło się to zrobić w C# na przykład:

// 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() 
     }); 

Zastrzeżenie

Rozumiem, że jest to „SQL Only” znakowany pytanie, ale nie mogą być inni ludzie tacy jak ja się kto może skorzystać z warstwy aplikacji zamiast polegać tylko na SQL, aby to się stało. Próbuję pokazać ludziom inne sposoby robienia tego samego, co może być pomocne. Nawet jeśli zostanie to odrzucone do zapomnienia, wiem, że ktoś z przyjemnością to przeczyta, ponieważ nauczyli się używać każdego narzędzia najlepiej i myśleli "nieszablonowo".