SQLは

2016-04-08 5 views
1

私は、SQL Serverを使用していますトップ#は別のテーブルから来ている複数のトップXレコードのテーブルを生成し、私は「トップ」のクエリ、複数の結果を含む出力を生成する必要が2012年SQLは

各問合せで戻される「トップ」行の数は、別の表の値に基づいて異なります。

私の最初のテーブルは、テーブル1と呼ばれ、NUMBERは、一意の各マーケット/メジャーごとに別のテーブルから返す必要があるトップローの数を示しています。

MARKET  MEASURE  NUMBER 
------  -------  ------ 
MarketA  MeasureA 411 
MarketA  MeasureB 396 
MarketB  MeasureA 548 
MarketB  MeasureC 424 
MarketC  MeasureC 411 

第二のテーブル、表2は、市場とMEASUREの組み合わせは、私の主キーで特定の市場/ MEASURE内の個々の人、のために詳細を示しています。与えられたマーケット/メジャーには多くのエントリーがあります。

MARKET  MEASURE  LASTNAME  COMPLIANT 
------  -------  --------  --------- 
MarketA  MeasureA  Coppola  Y 
MarketA  MeasureA  Winterbottom N 
MarketA  MeasureB  Scorsese  Y 
MarketC  MeasureC  Tarr   Y 

表1の各値について、昇順でLASTNAMEのソートに基づいてTable2の多くの最上行を戻す必要があります。たとえば、Table1にはMarketA/MeasureAの411という数字があるので、私の出力には、Table2のTOP 411 *行(LASTNAME昇順でソートされたその市場のすべての人に基づく)と、MarketA/MeasureB、MarketB/MeasureAのTOP 548行など、すべてのクエリを個別に「結合」したかのように(?)

Table1の各マーケット/測定値(1000以上)のUNION個別クエリを使用せずに、これを動的に行うにはどうすればよいですか?

ので、答えは

select TOP (select NUMBER from TABLE2) * 
from TABLE1 t1 
inner join TABLE2 t2 on t2.MARKET = T1.MARKET 
        and t2.MEASURE = T2.MEASURE 

.....のように、TOPの式で#を生成するために選択式を使用することであるように私は感じて...しかし、明らかに、私はいくつかの手順が不足していますTOP式はTABLE2から複数の値を戻しますが、それぞれのMARKET/MEASUREの組み合わせに対して「実行」する方法を理解できません。

大変助けになりました。

答えて

2

これはAPPLYは同じ苦境にある人のための

SELECT 
    * 

FROM 
    Table1 
    CROSS APPLY 
    (
     SELECT TOP (Table1.Number) 
      * 

     FROM 
      Table2 

     WHERE 
      Table1.Market = Table2.Market 
      AND Table1.Measure = Table2.Measure 

     ORDER BY 
      LastName 
    ) AS TopResults 

http://sqlfiddle.com/#!6/46b57/4

+0

私はこれを動作させることはできません。明らかに、私はTOP式で(Table1.Number)を使用することはできません。代わりにそれを同等のサブクエリに変更すると(TABLE1からNUMBERを選択)、同じサブクエリが複数の値を返す前に同じ問題が発生します。 –

+0

あなたのクエリは正しくないはずです。これが動作することを示すためにsqlfiddleを追加しました。 – mheptinstall

+0

上記はあなたの質問に答えましたか? – mheptinstall

1

に使用することができ、私が代わりにROW_NUMBER()ウィンドウ関数を使用して、同じことを達成するための別の方法を考え出したものですTOPを動的に使用しようとしています。考え方は、市場番号&小節で区切られ、姓で順序付けられたTable2に行番号を追加し、Table1.NumberをTable2に結合し、行番号がTable1.Numberよりも小さい行のみを選択して、 Table1.Numberに従って「上」の行数。

with temp as (select 'rownum' = row_number() over(partition by t2.market, t2.measure) 
                order by t2.lastname) 
       , t2.* 
       , t1.number 
       from table2 t2 
       inner join table1 t1 on t1.market = t2.market 
            and t1.measure = t2.measure) 
select * 
from temp 
where rownum <= number 
order by market, measure, rownum