2017-09-03 4 views
1

私は、各会社と各場所のトップアイテムを返すSQLクエリを作成しようとしています。MySQL複数のグループ内のカウントに基づく上位項目

Date  | Company | Location | Item   | Price | Quantity | Total_Amount 
----------|---------|----------|--------------|-------|----------|------------- 
1/10/2000 | ABC  | 1  | Food   | 2  | 6  | 12  
1/11/2000 | ABC  | 1  | Food   | 1  | 2  | 2 
1/12/2000 | ABC  | 2  | Food   | 10 | 5  | 50  
1/13/2000 | ABC  | 2  | Electronics | 100 | 2  | 200 
1/10/2000 | ABC  | 1  | Consumables | 10 | 5  | 50  
1/15/2000 | ABC  | 2  | Electronics | 100 | 3  | 300 
1/10/2000 | DEF  | 1  | Electronics | 50 | 5  | 250  
1/16/2000 | DEF  | 1  | Electronics | 50 | 4  | 200 
1/19/2000 | DEF  | 2  | Food   | 10 | 5  | 50  
1/14/2000 | DEF  | 2  | Food   | 2  | 10  | 20 
1/11/2000 | DEF  | 2  | Food   | 5  | 8  | 40  
1/11/2000 | DEF  | 2  | Electronics | 500 | 2  | 1000 

例えば、私がしたいことは返すことです場所ごと社あたりのカウントで最上位の項目である:私はこのようになります例MySQLのテーブル(table_x)を持っています。このように、一番上のアイテム数は企業ごと、場所ごとに異なります。

Company | Location | Item  | AVG(Price) | SUM(Total_Amount) | COUNT(*) 
--------|----------|-------------|------------|-------------------|--------- 
ABC  | 1  | Food  | 4   | 14    | 2 
ABC  | 2  | Electronics | 100  | 500    | 2 
DEF  | 1  | Electronics | 50   | 450    | 2 
DEF  | 2  | Food  | 5.67  | 110    | 3 

私はすべての会社およびロケーションにわたってこれを行う方法を知っているが、トラブル各特定のグループ内にあると、カウントすることにより、トップのアイテムを取得しています。理想的には、できるだけ多くのアイテムタイプがあれば、これを上位N個のアイテムに拡張できるようにしたいと考えています。

これは、出現に基づいてトップアイテムを生成するために実行したSQLクエリです。

SELECT Company, Location, Item, AVG(Price), SUM(Total_Amount), COUNT(*) FROM table_x 
GROUP BY Company, Location, Item 
ORDER BY Company, Location, COUNT(*) desc 
+0

何かトップ商品はいつですか?また、あなたが試したものを追加してください。 – Jeffrey

+0

こんにちはJeffrey、トップアイテムは、価格、数量または合計にかかわらず最も頻繁に発生したアイテムです。したがって、私が探している結果の上の例では、会社ABCとロケーション1のトップアイテムは、そのグループ内で2回発生したのに対し、エレクトロニクスと消耗品は1回だけだったので、食べ物でした。私は実行したクエリを追加するように編集しましたが、これはデータセット全体のカウントに基づいて上位のアイテムのみを表示します。それが合理的であれば、グループ内でこれを行うために文を洗練する場所を忘れてしまいます。 – Quest

答えて

1

使用MySQLの非標準的なグループ化機能:MySQLの(のみ)で

select * from (
    SELECT Company, Location, Item, AVG(Price), SUM(Total_Amount), COUNT(*) FROM table_x 
    GROUP BY Company, Location, Item 
    ORDER BY Company, Location, COUNT(*) desc 
) 
group by 1,2 

リストでグループから非集計列を省略したときに、それぞれの組み合わせの最初行が返されます。

バージョン5.7.5以降は、デフォルトで有効になっているONLY_FULL_GROUP_BYを無効にする必要があります。


@JeffreySQLFiddleを親切に提供してきました。

+1

あなたは2分で私を打ち負かす...ここでは[SQLフィドル](http://sqlfiddle.com/#!9/36ee39/25) – Jeffrey

+0

@jeffありがとうございます。私はSQLFiddleが良いために死んでいたと思った。それは約1年間働いていなかった。それがバックアップされていることを確認してください。 – Bohemian

+0

これは素晴らしいですね!しかし、集約列を含める場合はどうなりますか。クエリはどのように変化しますか? – Quest

関連する問題