2016-06-22 11 views
2

データセットの結果をピボットしようとしていますが、発生している集計はありません。SQLピボット集約なし

Select StufferID from from #temp_Stuffers where SponsorID IN (111,222,333) 

これは私に0-2の結果を与えます。 inは正常に動作しません - どのように私はあなたがあなたの望む結果を得るためにouter joinを使用する必要があることが

Sponsor ID StufferID1 StufferID2 
111   S1   S2 
222   S5 
333 

むしろ

SponsorID  StufferID 
111   S1 
111   S2 
222   S5 
+0

スポンサーごとに最大数のスタッファーがありますか? 'in'の代わりに' outer join'を使う必要があります。また、最大のスタッファー数が分からない場合は、 'dynamic sql'も使用する必要があります。 – sgeddes

+0

http://stackoverflow.com/q/1343145/6205293 – mo2

答えて

1

エイリアスを使用してテーブルの左結合を使用して、各列の最小値と最大値を見つけることができます。 私はOracleを使用しているので、これを少し変更してSQL Serverで動作させる必要があります。

SELECT TEMP_STUFFERS.SPONSORID, 
     MIN(TEMP_STUFFERS.STUFFERID) AS STUFFERID1, 
     MAX(TEMP_STUFFERS2.STUFFERID) AS STUFFERID2 
    FROM TEMP_STUFFERS 
    LEFT JOIN TEMP_STUFFERS TEMP_STUFFERS2 
     ON TEMP_STUFFERS.SPONSORID = TEMP_STUFFERS2.SPONSORID 
     AND TEMP_STUFFERS.STUFFERID != TEMP_STUFFERS2.STUFFERID 
WHERE TEMP_STUFFERS.SPONSORID IN (111,222,333) 
GROUP BY TEMP_STUFFERS.SPONSORID 
ORDER BY TEMP_STUFFERS.SPONSORID; 
+0

ピボットではありませんが、問題なく動作します。ありがとうございました。スポンサーIDを拡大するために何かをすることができます。 – 10thTiger

1

より作るためにピボットを使用することができます。まずwhereの基準をjoinに変更してください。そして、あなたは、これがrow_numberを使用して、上pivotにいくつかのフィールドを確立する必要があります:

select s.sponsorid, 
     max(case when t.rn = 1 then t.stufferid end) stufferid1, 
     max(case when t.rn = 2 then t.stufferid end) stufferid2 
from (select 111 as sponsorid union all select 222 union all select 333) s 
    left join (
     select *, row_number() over 
         (partition by sponsorid order by stufferid) rn 
     from #temp_Stuffers) t on s.sponsorid = t.sponsorid 
group by s.sponsorid 

あなたが潜在的なstufferid値の最大数がわからない場合は、あなたにもdynamic sqlを使用する必要があります。