2016-06-22 93 views
2

我正在尋找數據集結果的樞軸,但沒有聚合發生。SQL樞軸沒有聚合

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

這會給我0 - 2個結果。如何使用支點,使其

Sponsor ID StufferID1 StufferID2 
111   S1   S2 
222   S5 
333 

不是

SponsorID  StufferID 
111   S1 
111   S2 
222   S5 
+0

每個贊助商有沒有最大數量的stuffers?你需要使用'outer join'而不是'in'。如果您不知道最大數量的stuffers,那麼您還需要使用'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

您需要使用outer join得到你想要的結果 - in將無法​​正常工作。因此,請先將您的where條件移至join。然後,你需要建立一些領域pivot上,這款採用row_number

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爲好。