Asp.net 将行转换为列的SQL查询
我有一个使用SQLServer2008的.NETWeb应用程序。我试图在网格中显示的数据表包含实际上是另一个表的行的列。现在,我正在BLL中执行此操作,将数据读入数据表;从另一个表获取数据并将其放入第一个数据表的列中,然后遍历该数据表中的每一行数据以填充新列。非常耗时和缓慢 我相信这可以通过SQL 2012和更高版本中使用“转置”或类似的查询来实现,但不确定在2008年是否可行。我研究并尝试使用“pivot”,但我不擅长SQL,无法让它工作 这是DB表的简化示例,我需要显示:Asp.net 将行转换为列的SQL查询,asp.net,sql-server-2008,Asp.net,Sql Server 2008,我有一个使用SQLServer2008的.NETWeb应用程序。我试图在网格中显示的数据表包含实际上是另一个表的行的列。现在,我正在BLL中执行此操作,将数据读入数据表;从另一个表获取数据并将其放入第一个数据表的列中,然后遍历该数据表中的每一行数据以填充新列。非常耗时和缓慢 我相信这可以通过SQL 2012和更高版本中使用“转置”或类似的查询来实现,但不确定在2008年是否可行。我研究并尝试使用“pivot”,但我不擅长SQL,无法让它工作 这是DB表的简化示例,我需要显示: Facility
Facility Table:
FacilityID
12345
67890
PartnerInfo table:
PartnerID Partner
1 Partner1
2 Partner2
3 Partner3
FacilityPartner table:
FacilityID PartnerID
12345 1
12345 3
67890 2
67890 3
需要查询以返回以下内容:
FacilityID Partner1 Partner2 Partner3
12345 true false true
67890 false true true
首先要了解的是,就像许多其他语言一样,SQL有一种“编译”过程,在这个过程中生成执行计划。SQL查询必须能够在编译时知道精确的列数和列类型,而无需引用数据(它确实有一些可用于编译的表元数据,这就是
SELECT*
工作的原因)
这意味着,只有满足以下两个条件之一时,您才能执行所需操作:
Exec()
或sp\u executesql()
执行该字符串。这是因为最后一步为该字符串变量调用了一个新的“编译”过程和执行上下文当然还有第三种选择:在客户端代码中透视数据。这是我的偏好。不过,大多数人选择了选项2。首先要了解的是,就像许多其他语言一样,SQL有一种“编译”过程,在这个过程中生成执行计划。SQL查询必须能够在编译时知道精确的列数和列类型,而无需引用数据(它确实有一些可用于编译的表元数据,这就是
SELECT*
工作的原因)
这意味着,只有满足以下两个条件之一时,您才能执行所需操作:
Exec()
或sp\u executesql()
执行该字符串。这是因为最后一步为该字符串变量调用了一个新的“编译”过程和执行上下文当然还有第三种选择:在客户端代码中透视数据。这是我的偏好。不过,大多数人选择了选项2。下面应该会给出一些关于数据旋转的想法。它不会像你要求的那样给你准确的真假
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 @facility values (67891)
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
LEFT join @FacilityPartner fp on f.facilityId = fp.facilityId
LEFT 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
LEFT join @FacilityPartner fp on f.facilityId = fp.facilityId
LEFT JOIN @PartnerInfo p on p.partnerid = fp.partnerid) x
PIVOT(
avg(val)
for partn in ([partner1], [partner2],[partner3])
) as pvt
下面应该给出一些关于数据透视的想法。它不会像你要求的那样给你准确的真假
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 @facility values (67891)
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
LEFT join @FacilityPartner fp on f.facilityId = fp.facilityId
LEFT 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
LEFT join @FacilityPartner fp on f.facilityId = fp.facilityId
LEFT JOIN @PartnerInfo p on p.partnerid = fp.partnerid) x
PIVOT(
avg(val)
for partn in ([partner1], [partner2],[partner3])
) as pvt
您尝试过查询了吗?您尝试过查询了吗?通过“Pivot in your client code”,我假设您指的是我当前正在做的事情?我得到了合作伙伴名称的列表,将它们作为列添加到我以前查询的数据表(设施列表)中,然后逐行填充新列中的单元格。类似的,是的,但我倾向于使用正式的控制/中断逻辑。通过“在客户端代码中透视”我假设你指的是我目前正在做的事情?我得到了合作伙伴名称列表,将它们作为列添加到我以前查询的数据表(设施列表)中,然后逐行填充新列中的单元格。类似的,是的,但我倾向于使用正式的控制/中断逻辑。什么是p.PartnerN?它是p.Partner1、p.Partner2等的缩写吗?Partner似乎是一个关键字,我懒得使用[],因此我将该列命名为PartnerNI。我可以将您在此处列出的内容与Joel关于动态创建查询的建议结合起来,以达到我的目的。只有一个问题:如何将100和NULL输出更改为true和false?当Partner1为NULL时,您可以使用case语句作为case,然后使用'false'或'true'作为Partner1结束最后一个问题:为什么要使用“avg(val)”?p.PartnerN是什么?它是p.Partner1、p.Partner2等的缩写吗?Partner似乎是一个关键字,我懒得使用[],因此我将该列命名为PartnerNI。我可以将您在此处列出的内容与Joel关于动态创建查询的建议结合起来,以达到我的目的。只有一个问题:如何将100和NULL输出更改为true和false?当Partner1为NULL时,您可以使用case语句作为case,然后使用'false'或'true'作为Partner1结束最后一个问题:为什么要使用“avg(val)”?