2016-03-24 7 views
0

Nehmen Sie die folgende Abfrage. Dies holt mich die Top-10-Destinationen nach verkauften Einheiten und den Anteil dieser Destination an den verkauften Einheiten in allen Destinationen.Wie haben eine ‚andere‘ Zeile in einer MySQL-Abfrage zu einer Gruppe weniger signifikante Ergebnisse

Es gibt 124 Einzelergebnisse, aber die Aktie Prozentsatz von jedem unter dem Top 10 sind in der Regel eher unbedeutend (weniger als 1%).

Ist es möglich, eine Abfrage zu haben, die werden die Top 9 Ergebnisse von Einheiten geben und dann ein 10. ‚Andere‘ Reihe, die den Rest der Ergebnisse zusammenfasst?

Oder ist dies eine 2 Abfrage Job?

SELECT a.destination, 
     SUM(a.units) AS units, 
     SUM(a.units)/b.total * 100 AS `share` 
    FROM range_data AS a 
    CROSS JOIN (SELECT SUM(units) AS total 
        FROM range_data) AS b 
    GROUP BY a.destination 
    ORDER BY units DESC 
    LIMIT 10; 

Aktuelle Ergbnisssatzes

destination units share 
United Kingdom 433360 21.5943 
Turkey 323657 16.1278 
China 123264 6.1422 
Russia 121595 6.0591 
United States 106338 5.2988 
Israel 97461 4.8565 
Un Arab Emir 85221 4.2466 
Egypt 51572 2.5698 
Hong Kong 48932 2.4383 
Suriname 44650 2.2249 

Gewünschtes Ergebnis Set

destination units share 
United Kingdom 433360 21.5943 
Turkey 323657 16.1278 
China 123264 6.1422 
Russia 121595 6.0591 
United States 106338 5.2988 
Israel 97461 4.8565 
Un Arab Emir 85221 4.2466 
Egypt 51572 2.5698 
Hong Kong 48932 2.4383 
Other 165854 8.8766 
+0

Wenn Sie möchten, sollten Sie im Anschluss an diese einfachen zweistufigen Vorgehensweise: 1. Wenn Sie dies noch nicht getan haben, eine ordnungsgemäße DDLs (und/oder ein sqlfiddle), so dass wir das Problem leichter replizieren kann. 2. Wenn Sie dies noch nicht getan haben, geben Sie eine gewünschte Ergebnismenge an, die den Informationen in Schritt 1 entspricht. – Strawberry

+1

Sie können dies mit 'UNION' machen, aber es ist sehr ähnlich, eine zweite Abfrage auszuführen, außer für die php handling .. – Yuri

+0

Ich verstehe nicht, wie die letzte Zeile mit dem Ergebnissatz in Beziehung steht – Strawberry

Antwort

1

Dies ist ein 2-Abfrage Job, jedoch können Sie die 2-Abfragen in einer mit union kombinieren. Die erste Abfrage würde das gleiche wie das Original sein, so wird es eine Grenze 9 haben, anstelle von 10. Die anderen Abfrage, die anderen alle zusammenfassen wird:

(SELECT a.destination, 
    SUM(a.units) AS units, 
    SUM(a.units)/b.total * 100 AS `share` 
FROM range_data AS a 
CROSS JOIN (SELECT SUM(units) AS total 
       FROM range_data) AS b 
GROUP BY a.destination 
ORDER BY units DESC 
LIMIT 9) 
UNION 
(SELECT 'other', 
    SUM(a.units) AS units, 
    SUM(a.units)/b.total * 100 AS `share` 
FROM range_data AS a 
CROSS JOIN (SELECT SUM(units) AS total 
       FROM range_data) AS b 
LEFT JOIN (SELECT c.destination 
      FROM range_data AS c 
      GROUP BY c.destination 
      ORDER BY SUM(c.units) DESC 
      LIMIT 9) t ON a.destination=t.destination 
WHERE t.destination IS NULL) 
ORDER BY IF(destination='other',0,units) DESC 

Der letzte order by ist es, sicherzustellen, dass die ' anderen 'wird am Ende der Liste angezeigt.

+0

Tolles Zeug, vielen Dank dafür. Habe noch nie eine "benutzerdefinierte" Zeile gemacht. Und ich dachte nicht, dass es so einfach sein würde wie SEELCT "andere". Schöne Berührung –

Verwandte Themen