2016-03-24 1 views
0

次のクエリを実行します。これは、売り上げ単位でトップ10の目的地、そしてすべての目的地で販売された総単位のその目的地のシェアを私に取り込みます。重要度の低い結果をグループ化するためにMySQLクエリで 'その他'の行を持つ方法

個別の結果は124件ありますが、トップ10以下のシェアは通常1%未満です。

結果の残りの部分を要約した10番目の「その他」の行で上位9個の結果が得られるクエリを使用できますか?

これは2つのクエリジョブですか?

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; 

現在の結果が

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 

を設定所望の結果は

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

この2つの簡単な手順を実行することをお勧めします。1.まだ実行していない場合は、適切なDDL(および/またはsqlfiddle)を提供して問題を簡単に複製できます。 2.まだ実行していない場合は、手順1で提供された情報に対応する目的の結果セットを指定します。 – Strawberry

+1

UNIONで実行できるはずですが、2番目のクエリを実行する場合と似ています。 PHPハンドリング.. – Yuri

+0

最後の行が結果セットにどのように関係しているのかわかりません – Strawberry

答えて

1

設定しますこれは、しかし、あなたがunionを使用して一つに2つのクエリを組み合わせることができ、2クエリジョブです。第一クエリはちょうどそれが他のクエリは他のすべてを合計する10の代わりに、上限9を持つことになり、オリジナルと同じになります:ことを保証するために

(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 

最後order byがあります " 「その他」がリストの一番下に表示されます。

+0

素晴らしいこと、これは大変感謝しています。前に 'カスタム'行を作ったことはありません。そしてそれはSEELCT 'other'と同じくらいシンプルになるとは思わなかった。いい感じです –

関連する問題