2016-05-11 13 views
0

年ごとの各アイテムの合計数に基づいて上位10項目に基づいてトレンドラインを作成するファクトデータベースがあります。 私は次のことをやったが、それは例えば、私の2007年のための10個の以上のエンティティを選択しない:SQLは毎年トップ10を選択します

select TOP 10 sum(Quantity) as Quantity,DIM_Time.Year, DIM_Item.Name as Name 

from Fact_Purchase 
join DIM_Item on DIM_Item.BKey_ItemId = Fact_Purchase.DIM_Item 
join DIM_Time on DIM_Time.ID = Fact_Purchase.DIM_Time_DeliveryDate 
where Fact_Purchase.DIM_Company = 2 and DIM_Time.ID = FACT_Purchase.DIM_Time_DeliveryDate 

Group by dim_item.Name, DIM_Time.Year 
Order by Quantity DESC 

をどのように私は唯一のトップ10で、すべての私の年を経て最高量でトップ10の項目を選択します各年度のエンティティは?

あなたが推測できるとおり、会社は個人である、と私のレポート

+0

全体の合計にかかわらず、毎年トップ10のエンティティが必要ですか?または、年間の上位10の事業体が、各年度の合計で分割されていますか? –

+0

ああ、申し訳ありません。私は最高の説明をしようとした! - 毎年注文した数量がどのように発展しているかを見るために、毎年のそれぞれの合計を求めます。 –

答えて

2

でパラメータしようとしている私は、これはあなたがのために行くているものだと思います。あなたのテーブルを翻訳してしまったら、謝罪します。

select * 
from (
    select DIM_Time.[Year], dim_item.Name, SUM(Quantity) Quantity, RANK() OVER (PARTITION BY DIM_Time.[Year] ORDER BY SUM(Quantity) DESC) salesrank 
    from Fact_Purchase 
     join DIM_Item on DIM_Item.BKey_ItemId = Fact_Purchase.DIM_Item 
     join DIM_Time on DIM_Time.ID = Fact_Purchase.DIM_Time_DeliveryDate 
    where Fact_Purchase.DIM_Company = 2 and DIM_Time.ID = FACT_Purchase.DIM_Time_DeliveryDate 
    group by dim_item.Name, DIM_Time.[Year] 
) tbl 
where salesrank <= 10 
order by [Year], salesrank 

部OVER名/年によってサブクエリ基、及びRANK()は各年のSUM(数量)と再起動によってインクリメント行インデックスの並べ替えを設定します。そこから、10を超えるセールスランク(インデックス)で何かを除外しなければなりません。

+0

華麗!ありがとうございました –

0
SELECT 
    _year, 
    Name, 
    _SUM, 
    RANK_iD 
    FROM 
     (
      SELECT 
       _year, 
       Name, 
       _SUM, 
       DENSE_RANK()OVER(PARTITION BY _year,_Month ORDER BY _SUM DESC) AS RANK_iD 
      FROM(
       Select 
        DIM_Time AS _year, 
        DIM_Item as Name, 
        sum(Quantity) AS _SUM 
       from 
        #ABC 
       GROUP BY 
        _year, 
        Name 
      )A 
     )B 
    WHERE RANK_iD<=10 
+2

あなたは何をやっているのか分かりにくいですか?さらに動作しません。 –

関連する問題