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击败我:)