Sql server 不带summarzie的行标题的列值

Sql server 不带summarzie的行标题的列值,sql-server,tsql,rotation,Sql Server,Tsql,Rotation,我有一张简单的单张桌子: Group Name ------------------------------ Group A Marco Group B Sven Group A Adrian Group B Tina Group B Steffi Group C Jil Group C Bastian 要旋转就是这样。对于列组中的每个值一个新列: Group A Group B Group

我有一张简单的单张桌子:

 Group      Name      
------------------------------
 Group A    Marco
 Group B    Sven  
 Group A    Adrian
 Group B    Tina
 Group B    Steffi
 Group C    Jil
 Group C    Bastian
要旋转就是这样。对于列
组中的每个值
一个新列:

Group A      Group B      Group C
------------------------------
Adrian       Steffi       Bastian
Marco        Sven         Jil
             Tina
列“
组A
”、“
组B
”和“
组C
”按字母顺序排序

我用“结束时的案例”来尝试,但结果是:

Group A      Group B      Group C
------------------------------
Marco        null         null
Adrian       null         null
null         Steffi       null
null         Sven         null
null         Tina         null
null         null         Jil
null         null         Bastian
而且也没有分类


我怎样才能做到这一点?我需要你的帮助。

这里的静态解决方案:(但要小心,在CTE中,a组必须具有最大名称数:) (如果您想要更具动态性的内容,请编写…)

好的,你也可以使用这个:根据你的请求编辑(但只针对3组…)


欢迎使用StackOverflow:如果您发布代码、XML或数据示例,请在文本编辑器中突出显示这些行,并单击编辑器工具栏上的“代码示例”按钮(
{}
),以精确地格式化和语法突出显示它!选择(当t.group='group A'然后是t.user\U name END)[GruppeA],(当t.group='group B'然后是t.user\U name END)[GruppeB],(当t.group='group C'然后是t.user\U name END)[GruppeC]从[dbo]中选择(当t.group='GruppeC'然后是t.user\U name END)[GruppeC]。。组tHi!非常感谢!现在,我只需要动态地进行设置,并注意检测到组的名称数最大:-)
;WITH CTE AS (SELECT ROW_NUMBER() OVER (partition by [Group] ORDER BY [Group]) AS RN,[Group], Name 
             FROM YourTable)


SELECT x.Name AS GroupA, a.Name AS GroupB, z.Name AS GroupC
FROM CTE a
OUTER APPLY(SELECT Name FROM CTE b WHERE a.RN = b.RN AND b.[Group] = 'Group A') x
OUTER APPLY(SELECT Name FROM CTE c WHERE a.RN = c.RN AND c.[Group] = 'Group C') z
WHERE a.[Group] = 'Group B'
DECLARE @param_group1 varchar(50),
        @param_group2 varchar(50),
        @param_group3 varchar(50)

SET @param_group1 = 
(SELECT TOP 1 [Group] 
FROM YourTable
GROUP BY [Group] 
ORDER BY COUNT([Group]) DESC)

SET @param_group2 = 
(SELECT TOP 1 [Group] 
FROM YourTable
WHERE [Group] NOT IN (@param_group1)
GROUP BY [Group] 
ORDER BY COUNT([Group]) DESC)

SET @param_group3 = 
(SELECT TOP 1 [Group] 
FROM YourTable
WHERE [Group] NOT IN (@param_group1, @param_group2)
GROUP BY [Group] 
ORDER BY COUNT([Group]) DESC)

DECLARE @cmd VARCHAR(MAX)

SET @cmd = '
WITH CTE AS (SELECT ROW_NUMBER() OVER (partition by [Group] ORDER BY [Group]) AS RN,[Group], Name 
             FROM YourTable)


SELECT x.Name AS ['+@param_group1+'], a.Name AS ['+@param_group2+'], z.Name AS ['+@param_group3+']
into ##tmp1
FROM CTE a
OUTER APPLY(SELECT Name FROM CTE b WHERE a.RN = b.RN AND b.[Group] = '''+@param_group2+''') x
OUTER APPLY(SELECT Name FROM CTE c WHERE a.RN = c.RN AND c.[Group] = '''+@param_group3+''') z
WHERE a.[Group] = '''+@param_group1+''''


IF OBJECT_ID('tempdb..##tmp1') IS NOT NULL DROP TABLE ##tmp1
EXEC (@cmd)

SELECT [Group A],[Group B],[Group C]
FROM ##tmp1