SQL 没有汇总数据

SQL Pivot no aggregate

我正在寻找一个数据集的结果,但没有聚合发生。

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

这将给我 0 - 2 个结果。我如何使用 pivot 来制作它

Sponsor ID    StufferID1   StufferID2
111            S1           S2
222            S5
333

而不是

SponsorID     StufferID
111           S1
111           S2
222           S5

您需要使用 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

您可以使用左连接到 table 本身,使用别名查找每列的最小值和最大值。 您需要稍微修改它才能在 SQL 服务器中工作,因为我使用的是 Oracle。

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;