2016-06-22 77 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为好。