Sql server 2008 从多行到多列的存储过程

Sql server 2008 从多行到多列的存储过程,sql-server-2008,Sql Server 2008,这是我目前的数据: GID, AppID, GName, GDesig, GBusinessName 101 3002 A JO AB House 102 3002 B EO BD Ltd 我需要指出的是,行数可能是1到4。我想这样展示这张唱片: GID, AppID, GName, GDesig, GBusinessName, GName, GDesig, GBusinessName 101 3002 A JO

这是我目前的数据:

GID, AppID, GName, GDesig, GBusinessName
101   3002   A     JO       AB House
102   3002   B     EO       BD Ltd
我需要指出的是,行数可能是1到4。我想这样展示这张唱片:

GID, AppID, GName, GDesig, GBusinessName, GName, GDesig, GBusinessName
101   3002   A     JO       AB House      B      EO       BD Ltd
如何使用存储过程执行此操作?如果有人给我任何解决办法,那将对我有帮助

谢谢


Nur

您没有提到输出中每一行的唯一性。我假设它应该是
AppId
。考虑到这一点,诀窍是按划分
,其中您为每个AppId分组对每一行进行排序。你所寻求的是一个交叉表。假设您说过每个组最多可以有四行,我们可以从中构建一个静态交叉表

;With RnkItems As
    (
    Select GID, AppId, GName, GDesig, GBusinessName
        , Row_Number() Over ( Partition By AppId Order By GID, GName ) As Rnk
    From SourceData
    )
Select AppId
    , Min( Case When Rnk = 1 Then GName End ) As GName1
    , Min( Case When Rnk = 1 Then GDesig End ) As GDesig1
    , Min( Case When Rnk = 1 Then GBusinessName End ) As GBusinessName1

    , Min( Case When Rnk = 2 Then GName End ) As GName2
    , Min( Case When Rnk = 2 Then GDesig End ) As GDesig2
    , Min( Case When Rnk = 2 Then GBusinessName End ) As GBusinessName2

    , Min( Case When Rnk = 3 Then GName End ) As GName3
    , Min( Case When Rnk = 3 Then GDesig End ) As GDesig3
    , Min( Case When Rnk = 3 Then GBusinessName End ) As GBusinessName3

    , Min( Case When Rnk = 4 Then GName End ) As GName4
    , Min( Case When Rnk = 4 Then GDesig End ) As GDesig4
    , Min( Case When Rnk = 4 Then GBusinessName End ) As GBusinessName4
From RnkItems
Group By AppId

您没有提到输出中每行的唯一性。我假设它应该是
AppId
。考虑到这一点,诀窍是按
划分
,其中您为每个AppId分组对每一行进行排序。你所寻求的是一个交叉表。假设您说过每个组最多可以有四行,我们可以从中构建一个静态交叉表

;With RnkItems As
    (
    Select GID, AppId, GName, GDesig, GBusinessName
        , Row_Number() Over ( Partition By AppId Order By GID, GName ) As Rnk
    From SourceData
    )
Select AppId
    , Min( Case When Rnk = 1 Then GName End ) As GName1
    , Min( Case When Rnk = 1 Then GDesig End ) As GDesig1
    , Min( Case When Rnk = 1 Then GBusinessName End ) As GBusinessName1

    , Min( Case When Rnk = 2 Then GName End ) As GName2
    , Min( Case When Rnk = 2 Then GDesig End ) As GDesig2
    , Min( Case When Rnk = 2 Then GBusinessName End ) As GBusinessName2

    , Min( Case When Rnk = 3 Then GName End ) As GName3
    , Min( Case When Rnk = 3 Then GDesig End ) As GDesig3
    , Min( Case When Rnk = 3 Then GBusinessName End ) As GBusinessName3

    , Min( Case When Rnk = 4 Then GName End ) As GName4
    , Min( Case When Rnk = 4 Then GDesig End ) As GDesig4
    , Min( Case When Rnk = 4 Then GBusinessName End ) As GBusinessName4
From RnkItems
Group By AppId

您也可以使用数据透视表来获得结果


您也可以使用数据透视表来获得结果


GID是否在第一组(即101)的第二组中?您是否只想丢失结果集中的其他GID,即102、103或104?我只需要这些列,这些就足够了::AppID、GName、GDesig、GBusinessName、GName、GDesig、GBusinessNameThomas击败我:)是第一个i.e 101的第二个集中的GID吗?您是否只想丢失结果集中的其他GID,即102、103或104?我只需要这些列,这些就足够了::AppID、GName、GDesig、GBusinessName、GName、GDesig、GBusinessNameThomas击败我:)