2016-08-11 6 views
1

年、四半期、チーム、価格などの列を持つテーブルがあります。それはチームからのすべての売却を表示します。私たちには10チームあります。 毎年四半期ごとに3チームが最も売れていることを知りたい。だから私はどこにいらっしゃいましたか?この時点で、私は1チームあたり1四半期ごとに1年間の売上高をグループ化しました。まだ失われているのは、売り上げが最も高い3つのチームだけです。私は今のところこれを得た:グループ内のMS Access 2010 SQL Top 3 Sales by

SELECT 
    a1.year, 
    a1.quarter, 
    a1.team, 
    sum(a1.price) as Total 

FROM 
    tbl_sales a1  

inner JOIN 
    tbl_sales a2 
     ON a1.year = a2.year 
      and a1.quarter = a2.quarter 
      and a1.team = a2.team 
      and a1.price = a2.price 
    where 
      some restrictions here 
GROUP BY 
    a1.year, 
    a1.quarter, 
    a1.team 

何かが、私はトップの機能を持つだけでサブクエリが役立つことを、近いですが、私はそれを把握することはできませんと言われます。任意のヘルプは非常に高く評価されています:) ありがとうたくさん! MS Accessで

+0

最後に「ORDER BY Total DESC」を追加します。 AccessはSELECT TOP 3をサポートしていますか? – jarlh

+0

https://support.office.com/en-us/article/ALL-DISTINCT-DISTINCTROW-TOP-Predicates-24f2a47d-a803-4c7c-8e81-756fe298ce57によれば、TOPは完全に有効です。 – ThisIsImpossible

答えて

0

試してみてください。

SELECT TOP 3 
    a1.year, 
    a1.quarter, 
    a1.team, 
    sum(a1.price) as Total 

FROM 
    tbl_sales a1  

inner JOIN 
    tbl_sales a2 
     ON a1.year = a2.year 
      and a1.quarter = a2.quarter 
      and a1.team = a2.team 
      and a1.price = a2.price 
    where 
      some restrictions here 
GROUP BY 
    a1.year, 
    a1.quarter, 
    a1.team 

ORDER BY 
    sum(a1.price) DESC 

編集、次を試してみてください、あなたは正しい結果セットを取得することを確認するために追加の基準が必要になる場合がありますが、これは、私は、where句で指定された各四半期のトップ3を返す必要がありますあなたが自己を使用している理由がわからないので、私はそれを残したが、必要であれば、それはに戻って追加することができます参加:、

SELECT TOP 3 
    a1.year, 
    a1.quarter, 
    a1.team, 
    sum(a1.price) as Total 

FROM 
    tbl_sales a1 

WHERE 
    'some restrictions here' 
    AND a1.quarter = 1 --(or however quarters are identified) 
    AND a1.year = 2015 --(or however years are identified) 

GROUP BY 
    a1.year, 
    a1.quarter, 
    a1.team 

ORDER BY 
    sum(a1.price) DESC 

UNION ALL 

SELECT TOP 3 
    a2.year, 
    a2.quarter, 
    a2.team, 
    sum(a2.price) as Total 

FROM 
    tbl_sales a2 

WHERE 
    'some restrictions here' 
    AND a2.quarter = 2 
    AND a2.year = 2015 

GROUP BY 
    a2.year, 
    a2.quarter, 
    a2.team 

ORDER BY 
    sum(a2.price) DESC 

UNION ALL 

SELECT TOP 3 
    a3.year, 
    a3.quarter, 
    a3.team, 
    sum(a3.price) as Total 

FROM 
    tbl_sales a3 

WHERE 
    'some restrictions here' 
    AND a3.quarter = 3 
    AND a3.year = 2015 

GROUP BY 
    a3.year, 
    a3.quarter, 
    a3.team 

ORDER BY 
    sum(a3.price) DESC 

UNION ALL 

SELECT TOP 3 
    a1.year, 
    a1.quarter, 
    a1.team, 
    sum(a1.price) as Total 

FROM 
    tbl_sales a4 

WHERE 
    'some restrictions here' 
    AND a4.quarter = 4 
    AND a4.year = 2015 

GROUP BY 
    a4.year, 
    a4.quarter, 
    a4.team 

ORDER BY 
    sum(a4.price) DESC 

あなたは、where句を除いて、テーブルの間に違いは基本的にありません見ることができるようにあなたはそれらの4つのテーブルの組合に限定されず、それは単なる例ですが、より多くの四半期をカバーする必要がある場合は、より多くの表を結合して結合する必要があることに留意してください。これは、時間の経過とともにテーブルをユニオンに追加し続ける必要があるので、非常に扱いにくくなる可能性があります。

+0

こんにちは。時間をとってくれてありがとう!これは、すべての四半期に及ぶ年最高のチームセールスをもたらします。私も同様に四半期ごとに必要です....近づいて:) – luftlinie

+0

これを行うには、おそらく各四半期ごとに別のテーブルを作成し、それらをすべて一緒に結合する必要があります。これは、上位3チームと各四半期を追加します結果セットとあなたが探しているものをあなたに与えます。 – ThisIsImpossible

+0

これはどのようにすばやくアイデアですか? – luftlinie

0

、あなたがこのTOPINを使用して行うことができます。

select s.* 
from tbl_sales as s 
where s.team in (select top (3) s2.team 
       from tbl_sales as s2 
       where s2.year = s.year and s2.quarter = s.quarter 
       order by s2.price desc 
       ); 

をあなたは彼らが何であるかに応じて、両方の外側のクエリと内側のクエリに制限を追加する必要があるかもしれません。