2016-10-26 11 views
2

今年からトップセラーになった製品の前年度のデータを選択して、時間の経過とともにどのように行ったかを確認しようとしています。指定された年のTOPに含まれているSQL選択行

私は現在のようなものがあります:私は現在の年のためのデータを取得

SELECT TOP 10 * 
WHERE Table.Year = 2016 
ORDER BY Table.Transactions DESC 

を、私はその今年の与えられた、前の年の同じトップ10のためのデータを取得するかどうかはわかりませんそうなの線に沿って何かを実行する方法があった場合、私は思っていた前の年のトップ10

からトップ10を異なります

SELECT * 
WHERE Table.Year = 2015 
AND (order ID was in Top 10 in 2016) 
ORDER BY Table.Transactions DESC 

はっきり除いて、私は何のIDを持っていません括弧内の条件の代わりに何を置くべきか。

ご意見をいただければ幸いです。ありがとう!

+1

サンプルデータと希望の結果を投稿できますか? – Lamak

答えて

1

あなたはこの欲しいん:

select t.* 
from (select t.*, 
      row_number() over (partition by year order by transactions desc) as seqnum 
     from t 
    ) t 
where seqnum <= 10; 

もう一つの楽しみの方法を使用することです:

SELECT * 
From Table 
WHERE Table.Year = 2015 
AND ID IN (
    SELECT TOP 10 ID 
    FROM Table 
    WHERE Table.Year = 2016 
    ORDER BY Table.Transactions DESC 
) 
ORDER BY Table.Transactions DESC 
+0

ありがとう!これはトリックをするように思える!唯一の問題は実際には「ID」フィールドがなく、代わりに7つの異なるフィールドの組み合わせを使用して商品を特定することです(わかりました、私は知っています)。 – RK13

+0

@ RK13では、7つのフィールドを区切り文字で区切って追加し、単一の値を比較したり、 'FROM'節のセットに参加することができます。すべての7つのフィールド – Beth

+0

なぜそれが働かないのか分かりません。 –

0

ノートIDがPK

SELECT * 
FROM YourTable 
WHERE YourTable.Year = 2015 
AND ID IN 
(SELECT TOP 10 ID 
WHERE Table.Year = 2016 
ORDER BY Table.Transactions DESC) 
1

使用ウィンドウ関数のようないくつかのユニークな値である必要がありますcross apply

select t.* 
from (select 2015 as yyyy union all select 2016) y cross apply 
    (select top 10 t.* 
     from t 
     where t.year = y.yyyy 
     order by transactions desc 
    ) t; 

年を明示的に指定する代わりに、サブクエリ(select distinct year from t) yを使用できます。

+0

ありがとう!これはサーバー管理スタジオで機能しますか?私はかなり新しくSQLと私は排他的にサーバー管理スタジオを使用していますが、私はまだ "パーティション分割"または "クロス適用"に出くわしました – RK13

+1

はいそれは@ RK13を働くでしょう – scsimon

+0

ありがとう@scsimon! – RK13

0
select  * 

from  (select  t.* 
         ,dense_rank() over (partition by t.year order by t.transactions desc) as dr 

      from  t 
      ) t 

where  t.dr <= 10 

order by t.year 
      ,t.dr 
; 
関連する問題