Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 将行转换为列的SQL查询_Asp.net_Sql Server 2008 - Fatal编程技术网

Asp.net 将行转换为列的SQL查询

Asp.net 将行转换为列的SQL查询,asp.net,sql-server-2008,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

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*
工作的原因)

这意味着,只有满足以下两个条件之一时,您才能执行所需操作:

  • 您必须提前知道合作伙伴的确切数量(在本例中是列的名称)。即使对于使用PIVOT关键字的查询也是如此
  • 您必须愿意使用动态SQL分多个步骤来完成这项工作,第一步是查看数据,以了解需要多少列。然后,您可以在varchar变量中建立一个新查询,最后使用
    Exec()
    sp\u executesql()
    执行该字符串。这是因为最后一步为该字符串变量调用了一个新的“编译”过程和执行上下文

  • 当然还有第三种选择:在客户端代码中透视数据。这是我的偏好。不过,大多数人选择了选项2。

    首先要了解的是,就像许多其他语言一样,SQL有一种“编译”过程,在这个过程中生成执行计划。SQL查询必须能够在编译时知道精确的列数和列类型,而无需引用数据(它确实有一些可用于编译的表元数据,这就是
    SELECT*
    工作的原因)

    这意味着,只有满足以下两个条件之一时,您才能执行所需操作:

  • 您必须提前知道合作伙伴的确切数量(在本例中是列的名称)。即使对于使用PIVOT关键字的查询也是如此
  • 您必须愿意使用动态SQL分多个步骤来完成这项工作,第一步是查看数据,以了解需要多少列。然后,您可以在varchar变量中建立一个新查询,最后使用
    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)”?