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;
我正在寻找一个数据集的结果,但没有聚合发生。
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;