C# 将行转换为列的SQL查询-重温

C# 将行转换为列的SQL查询-重温,c#,asp.net,sql-server-2008,C#,Asp.net,Sql Server 2008,我有一个使用SQLServer2008的.NETWeb应用程序。我试图在网格中显示的数据表包含实际上是另一个表的行的列。现在,我正在BLL中执行此操作,将数据读入数据表;从另一个表获取数据并将其放入第一个数据表的列中,然后遍历该数据表中的每一行数据以填充新列。非常耗时和缓慢 我相信这可以通过SQL 2012和更高版本中使用“转置”或类似的查询来实现,但不确定在2008年是否可行。我研究并尝试使用“pivot”,但我不擅长SQL,无法让它工作 这是DB表的简化示例,我需要显示: Facility

我有一个使用SQLServer2008的.NETWeb应用程序。我试图在网格中显示的数据表包含实际上是另一个表的行的列。现在,我正在BLL中执行此操作,将数据读入数据表;从另一个表获取数据并将其放入第一个数据表的列中,然后遍历该数据表中的每一行数据以填充新列。非常耗时和缓慢

我相信这可以通过SQL 2012和更高版本中使用“转置”或类似的查询来实现,但不确定在2008年是否可行。我研究并尝试使用“pivot”,但我不擅长SQL,无法让它工作

这是DB表的简化示例,我需要显示:

Facility Table:
FacilityID
12345
67890
99999

PartnerInfo table:
PartnerID    Partner
1            Partner1
2            Partner2
3            Partner3

FacilityPartner table:
FacilityID    PartnerID    Active
12345         1              1
12345         3              0
67890         2              1
67890         3              1
需要查询以返回以下内容:

FacilityID    Partner1    Partner2    Partner3
12345         true        false       true
67890         false       true        true
99999         false       false       false
我发布了这个问题,得到了一个似乎有效的回复(下面的查询)。但是,当我查看设施列表时,查询似乎排除了所有没有合作伙伴的设施(例如,不显示设施id 99999)。我尝试过使用查询并将内部联接更改为左联接,但这没有帮助

declare  @facility table (facilityId int)
declare  @PartnerInfo  table (partnerid int, partnerN varchar(1000))
declare  @FacilityPartner table (facilityId int,partnerid int)

insert into @facility values (12345)
insert into @facility values (67890)

insert into @PartnerInfo values (1, 'partner1')
insert into @PartnerInfo values (2, 'partner2')
insert into @PartnerInfo values (3, 'partner3')

insert into @FacilityPartner values(12345, 1)
insert into @FacilityPartner values(12345, 3)
insert into @FacilityPartner values(67890, 2)
insert into @FacilityPartner values(67890, 3)

select f.facilityId as facid, p.PartnerN as partn, 100 as val
FROM @facility f
Inner join @FacilityPartner fp on f.facilityId = fp.facilityId
INNER JOIN @PartnerInfo p on p.partnerid = fp.partnerid

select facid, Partner1 , partner2,partner3 FROM 

(select f.facilityId as facid, p.PartnerN as partn, 100 as val
FROM @facility f
Inner join @FacilityPartner fp on f.facilityId = fp.facilityId
INNER JOIN @PartnerInfo p on p.partnerid = fp.partnerid) x
PIVOT(
avg(val)
for partn in ([partner1], [partner2],[partner3])
) as pvt

将内部联接更改为左外部联接将非常有效

根据OP的评论更新:

结果:

facid   p1  p2  p3
------------------
12345   1   0   0
67890   0   1   1
99999   0   0   0

如果FacilityPartner表有一个“活动”列(真/假或0/1),我如何为该合作伙伴返回0,就好像它将falg设置为零一样?例如,在更新的FacilityPartner表中,第二行有“false”,您的结果将显示“12345 1 0 0”而不是“12345 1 0 1”?
facid   p1  p2  p3
------------------
12345   1   0   0
67890   0   1   1
99999   0   0   0